def dataReceived(self, data): self._bufer = self._bufer + data #[uint32_t playerid][uint16_t msg_channel][uint16_t cmd][string amf3_data] LOG.info('len data: %s' % (len(data))) while(len(self._bufer) >= 12): (playerid, msg_channel, cmd, amf3_data_len) = struct.unpack("!IHHI", self._bufer[0:12]) LOG.info("playerid: %s, msg_channel: %s, cmd: %s, amf3_data_len:\ %s" % (playerid, msg_channel, pattern.to_hex(cmd), amf3_data_len,)) amf3_data_fmt = '!%ss' % (amf3_data_len) if (len(self._bufer[12:]) >= amf3_data_len): rqstid = uuid.uuid1() self._rqstid[rqstid] = {'rqstid':rqstid, 'msg_channel':msg_channel, 'playerid':playerid, 'cmd':cmd} (amf3_data,) = struct.unpack(amf3_data_fmt, self._bufer[12:12+amf3_data_len]) LOG.info("amf3_data: %s" % repr(amf3_data)) self._bufer = self._bufer[12+amf3_data_len:] decoder = Decoder(amf3=True) data = decoder.decode(amf3_data) LOG.info("data: %s" % (data)) try: callback = self._callback[cmd] callback(self, playerid, rqstid, data) except KeyError: LOG.ERROR("CMD error, The CMD: %s can not be handled" % (pattern.to_hex(cmd))) break
def forward_msg(self, cmd, amf3_data, playerid, rqstid, flag, playerid_list=[]): #[uint8_t flag][uint32_t targetLen][target_players][uint8_t ch='\0']\ #[uint16_t msg_channel][uint16_t cmd][string amf3_data] msg_channel = self._rqstid[rqstid]['msg_channel'] LOG.info("cmd: %s, amf3_data: %s, playerid: %s, rqstid: %s, flag: %s,\ playerid_list: %s" % (pattern.to_hex(cmd), repr(amf3_data), playerid,\ rqstid, flag, playerid_list)) target_players = '' targetLen = 1 seperator = '\0' playerid_list = [] if flag == 0: _playerid = [] _playerid.append(playerid) playerid_list = list(set(playerid_list).union(_playerid)) for i in xrange(len(playerid_list)): target_players += struct.pack('!I', playerid_list[i]) LOG.info('len(playerid_list): %s' % (len(playerid_list))) elif flag == 1: pass elif flag == 2: pass else: return LOG.debug('target_players: %s' % (repr(target_players))) targetLen += len(target_players) LOG.debug('targetLen: %s' % (targetLen)) replyMsg = struct.pack("!BI", flag, targetLen) replyMsg += target_players replyMsg += struct.pack("!sI", seperator, cmd) replyMsg += struct.pack(self.get_amf3_fmt(amf3_data), len(amf3_data), amf3_data) LOG.info('len(amf3_data): %s' % (len(amf3_data))) LOG.info('amf3_data: %s' % (repr(struct.pack(self.get_amf3_fmt(amf3_data),len(amf3_data), amf3_data)))) LOG.info('replyMsg: %s' % (repr(replyMsg))) data_count = self._sock.send(replyMsg) LOG.info('send %s data' % (data_count))