如何修复“ struct.error:解压缩需要24个字节的缓冲区”才能解压缩TCP数据包?

时间:2019-09-13 03:57:49

标签: python sockets server

因此,我尝试对进来的数据包进行解包并显示它们。但是我遇到了我不理解的错误。也许我只是缺乏对以正确格式打开数据包的理解,但是如果您能指出正确的方向,谢谢您

'! H H L L H H H H H H', data[:24])
 struct.error: unpack requires a buffer of 24 bytes

所以我试图将格式类型更改为字节,无符号长,但是idk是因为出现另一个错误

        import socket
        import struct

        TCP_IP = '127.0.0.1'
        TCP_PORT = 4200
        BUFFER_SIZE = 1024
        MESSAGE = b"01111001"

        TAB_1 = '\t - '
        TAB_2 = '\t\t - '
        TAB_3 = '\t\t\t - '
        TAB_4 = '\t\t\t\t - '

        DATA_TAB_1 = '\t   '
        DATA_TAB_2 = '\t\t   '
        DATA_TAB_3 = '\t\t\t   '
        DATA_TAB_4 = '\t\t\t\t   '

        def main():
            s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
            s.connect((TCP_IP, TCP_PORT))
            s.send(MESSAGE)

            while True:
                data, addr= s.recvfrom(65535)
                src_port, dest_port, sequence, acknowledgment, flag_urg, flag_ack, flag_psh, flag_rst, flag_syn, flag_fin = struct.unpack(
                    '! H H L L H H H H H H', data[:24])
                print(TAB_1 + 'TCP Segment:')
                print(TAB_2 + 'Source Port: {}, Destination Port: {}'.format(src_port, dest_port))
                print(TAB_2 + 'Sequence: {}, Acknowledgment: {}'.format(sequence, acknowledgment))
                print(TAB_2 + 'Flags:')
                print(TAB_3 + 'URG: {}, ACK: {}, PSH: {}'.format(flag_urg, flag_ack, flag_psh))
                print(TAB_3 + 'RST: {}, SYN: {}, FIN:{}'.format(flag_rst, flag_syn, flag_fin))



        # Unpack IPv4 packet
        def ipv4_packet(data):
            version_header_length = data[0]
            version = version_header_length >> 4
            header_length = (version_header_length * 15) * 4
            ttl, proto, src, target = struct.unpack('! 8x BB 2x 4s 4s', data[:24])
            return version, header_length, ttl, proto, ipv4(src), ipv4(target), data[header_length: ]

        # Return properly formatted IPv4 address
        def ipv4(addr):
            return '.'.join(map(str, addr))

        # Unpack TCP segment
        def tcp_segment(data):
            (src_port, dest_port, sequence, acknowledgement, offset_reserved_flags) = struct.unpack('! H H L L H', data[:14])
            offset = (offset_reserved_flags >> 12) * 4
            flag_urg = (offset_reserved_flags & 32) >> 5
            flag_ack = (offset_reserved_flags & 16) >> 4
            flag_psh = (offset_reserved_flags & 8) >> 3
            flag_rst = (offset_reserved_flags & 4) >> 2
            flag_syn = (offset_reserved_flags & 2) >> 1
            flag_fin = offset_reserved_flags & 1


        main()

0 个答案:

没有答案