#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # #------------------------------------------------------------------------------- # #MMORPG·â°üÍ· from ctypes import(c_int, Structure, c_ushort, c_ubyte, memset, addressof, memmove, sizeof, create_string_buffer, string_at) #import logging #for test from Common import (mylog) from binascii import b2a_hex from DBCommon import error #enum EServerType #{ ( stMin, # 0 stData, # 1 stCenterGate, # 2 stGame, # 3 stLogin, # 4 stRoute, # 5 stMap, # 6 stGate, # 7 stInterface, # 8 stDbSaveServer, # 9 stCreateRoleServer, # 10 stGMTool, # 11 stMergeClient, # 12 stNoSense, # 13 ÎÞÒâÒ壬µ±²»ÐèÒªÖ¸¶¨·þÎñÆ÷ÀàÐÍʱʹÓà stMax # 14 ) = range(0, 15) #}; class tagMMORPGPackHead(Structure): '''·â°üÍ·Àà''' _pack_ = 1 _fields_ = [('sessionID', c_int), ('poolIndex', c_ushort), ('type', c_ubyte), ('dstSvrType', c_ubyte), ('srcSvrType', c_ubyte) ] def __init__(self): Structure.__init__(self) self.clear() def assign(self, anotherHead): memmove(addressof(self), addressof(anotherHead), sizeof(self)) def clear(self): memset(addressof(self), 0, self.getLength()) def readData(self, buf, pos = 0, length = 0): if not pos <= length: msg = error.formatMsg('error', error.ERROR_NO_10, 'error pos = %d len = %d'%(pos, len)) mylog.error(msg) return -1 if len(buf) < pos + self.getLength(): msg = error.formatMsg('error', error.ERROR_NO_11, 'len = %d while %d expected!'(len(buf) - pos, self.getLength())) mylog.error(msg) return -1 self.clear() memmove(addressof(self), buf[pos:], self.getLength()) return self.getLength() def getLength(self): return sizeof(tagMMORPGPackHead) def getBuffer(self): return string_at(addressof(self), self.getLength()) def outputString(self): return '''//MMORPG·â°üÍ·//tagMMORPGPackHead: sessionID:0x%x, poolIndex:0x%x, type:0x%x, dstSvrType:0x%x, srcSvrType:0x%x '''%( self.sessionID, self.poolIndex, self.type, self.dstSvrType, self.srcSvrType ) class MMORPGPacket(): '''·â°üÀà''' def __init__(self): # ObjPool.PoolObj.__init__(self) self.__packHead = tagMMORPGPackHead() self.__buf = '' def assignHead(self, anotherPack): self.__packHead.assign(anotherPack.__packHead) def assign(self, other): self.assignHead(other) self.__buf = other.__buf def getPackHead(self): return self.__packHead def getDstSvrType(self): return self.__packHead.dstSvrType def setSrcSvrType(self, srcSvrType): self.__packHead.srcSvrType = srcSvrType def clear(self): self.__packHead.clear() self.__buf = '' self.__recvFromSocketID = -1 self.__sendViaSocketID = -1 def readData(self, buf): bufLen = len(buf) if bufLen < self.__packHead.getLength(): return -1 readLen = self.__packHead.readData(buf, 0, bufLen) if -1 == readLen: return -1 if bufLen - readLen <= 0: return readLen self.__buf = buf[readLen:] return bufLen def getPackData(self): return self.__packHead.getBuffer() + self.__buf def setBuffer(self, buf): self.__buf = buf def getBuffer(self): return self.__buf def getLength(self): return len(self.__buf) def outputString(self): return self.__packHead.outputString() + b2a_hex(self.__buf)