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