我正在构建一个UDP服务器来解析和验证传入的UDP数据包。我能够接收和解析数据包,但标头值不是我所期望的。
这是传入数据包的结构
包ID(4字节)
包序列(4字节)
XOR键(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_HEADER(UDP_HEADER(PAYLOAD)))
我想正确解析标题,然后提取有效负载 如果有人能指出我正确的方向,我真的很感激
答案 0 :(得分:6)
不幸的是,标准套接字接口不允许您访问数据到达的数据帧,也不包括IP数据报头和传输层的TCP / UDP头。
要掌握较低级别的数据,您必须使用所谓的原始套接字接口,Windows试图阻止您使用,因为您可能是黑客。 This article可能会给你一些线索。