def parse_data(self, data, direction): if direction == DIRECTION_C2S: data = self.data_to_server + data else: data = self.data_to_client + data time_str = time.strftime("%H:%M:%S") while True: if len(data) < 4: break size = BitStream(bytes=data[:4]).uint if len(data) < size: break #log.info("parse packet (size=%d)" % size) reader = BitReader(data[4:size]) while True: type_and_data = type_descriptor.parse_game_msg(reader) if type_and_data is None: break if self.type_mask[type_and_data[0]]: continue msg = { IDX_MSG_TYPE : type_and_data[0], IDX_MSG_DATA : type_and_data[1], IDX_MSG_DIR : direction, IDX_MSG_TIME : time_str, } msg_index = len(self.msgs) self.msgs.append(msg) self.frame.add_row(msg_index) if reader.get_bit_len() > 7: log.warn("%d bits left" % reader.get_bit_len()) data = data[size:] if len(data) > 0: log.warn("%d bytes left" % len(data)) if direction == DIRECTION_C2S: self.data_to_server = data else: self.data_to_client = data self.frame.refresh_statusbar()
sys.stderr.write("[ERROR] %s\n" % msg[1]) sys.exit(2) send_msg(sock, 10, join_bnet_game_message) incoming = "" while True: data = sock.recv(1024) if len(data) == 0: break incoming += data while True: size = try_get_packet_size(incoming) if size is None: break reader = BitReader(incoming[4:size]) while reader.get_bit_len() >= 9: opcode = reader.read_int(9) print "------ opcode %d --------" % opcode if opcode not in MESSAGE_DISPATCHER: sock.close() return MESSAGE_DISPATCHER[opcode](reader) incoming = incoming[size:] sock.close() if __name__ == "__main__": start()