2016-10-03 62 views
3

我正在构建一个UDP服务器来解析和验证传入的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(有效载荷)))

我想正确解析头,和然后提取净荷。
我会很感激,如果帧你的数据在到达某一个可以点我到正确的方向

+1

你没有得到IP/UDP头,只是数据包的有效载荷......这是故意完成的。你碰巧打开这个套接字作为IP4/UDP,但是'套接字'是一个通用接口,可以和多种传输协议一起工作。例如,它应该透明地使用IP6甚至(噢,我的哎呀!)IPX。 – tdelaney

回答

5

不幸的是标准的插座接口不给你访问到数据,它也不包括IP数据报头也不来自传输层的TCP/UDP头。

要获取较低级别的数据,您必须使用所谓的原始套接字接口,因为您可能是黑客,因此Windows试图阻止您使用它。 This article可能会给你一些线索。

+0

我想我会称之为“幸运的”,因为它的通用接口......但我喜欢你的anwser,否则! – tdelaney