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()
def test_char_array(): writer = BitWriter() for i in xrange(len(WORDS)): writer.write_char_array(len(WORDS) + i, WORDS) reader = BitReader(writer.get_bytes()) for i in xrange(len(WORDS)): assert WORDS == reader.read_char_array(len(WORDS) + i) for i in xrange(1000): start = random.randint(0, len(WORDS)-1) end = random.randint(start+1, len(WORDS)) sample = WORDS[start:end] max_length = random.randint(len(sample), len(sample) * 2) writer = BitWriter() writer.write_char_array(max_length, sample) reader = BitReader(writer.get_bytes()) assert sample == reader.read_char_array(max_length)
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()