예제 #1
0
    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()
예제 #2
0
파일: test.py 프로젝트: smallka/piablo
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)
예제 #3
0
파일: client.py 프로젝트: smallka/piablo
        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()