来自socket()的UDP数据包头不符合预期

2024-04-26 08:06:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在构建一个UDP服务器来解析和验证传入的UDP数据包。我能够接收和解析数据包,但头值不是我所期望的。

这是传入包的结构

数据包ID(4字节)
数据包序列(4字节)
异或键(2字节)
数据包中的校验和数(2字节)
循环校验和CRC32(变量)

要发送数据包

with open('payloadfile.bin') as op:
    payload = pickle.load(op)

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

for i in payload:
    sock.sentto(payload, ('127.0.0.1',4545))

接收并解析此数据包

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind('127.0.0.1',4545)

while 1:
    packet = sock.recvfrom(65565)
    packet = packet[0]

    # parse IP
    ip_header = packet[0:20]
    iph = struct.unpack('!BBHHHBBH4s4s' , ip_header)

    #all the following values are incorrect
    version_ihl = iph[0]
    version = version_ihl >> 4
    ihl = version_ihl & 0xF

    ttl = iph[5]
    protocol = iph[6]
    s_addr = socket.inet_ntoa(iph[8]);
    d_addr = socket.inet_ntoa(iph[9]);

    # parse UDP
    packet = packet[20:28]
    data = packet[header_length:]
    source_port, dest_port, data_length, checksum = struct.unpack("!HHHH", header)

据我目前了解,这应该是一般结构
IP_报头(UDP_报头(有效负载)))

我想正确地解析头,然后提取有效负载。


Tags: 字节packetversionsocket数据包结构校验header
1条回答
网友
1楼 · 发布于 2024-04-26 08:06:12

不幸的是,标准套接字接口不允许您访问数据到达的数据帧,也不包括IP数据报报头和传输层的TCP/UDP报头。

为了获得较低级别的数据,你不得不使用所谓的原始套接字接口,Windows的用户试图阻止你使用这个接口,因为你可能是一个黑客。This article可能会给你一些线索。

相关问题 更多 >