你已经有数据了。但是,如果你想要的是完整的UDP数据包,那么原始的UDP数据包是完整的。在
在某些平台上,可以将普通UDP套接字设置为IP_HDRINCL,或者有其他等效的套接字。如果您这样做,每个recvfrom将在数据中包含头,因此您已经获得了所需的一切。在
在其他平台上,您可以使用SOCK_RAW,而不是{}。您可以使用原始套接字执行的操作会发生巨大变化。在许多Unix平台上,您可以将IPPROTO_UDP与SOCK_RAW一起使用,然后使用bind到一个普通的UDP地址和端口,尽管可能有一些限制,而且每个平台上的限制不同。例如,在OSX上,您必须是root用户才能创建一个原始套接字,并且只能将一个原始套接字绑定到一个接口地址(意思是没有”/INADDR_ANY/’0.0.0.0′)。如果你用谷歌搜索“SOCK_RAW Python”和“SOCK_RAW”,你应该能够找到你需要的东西。(sockets module docs中的最后一个示例演示了如何在Windows上使用原始套接字。)
一旦获得数据,将其保存到pcap文件并不困难。格式在Wireshark Wiki的LibpcapFileFormat上有文档记录。如果您熟悉stdlib struct模块,那么应该很容易就知道如何编写这种格式。下面是一个简单的例子:pcap_hdr = struct.pack(‘=IHHiIII’,
0xa1b2c3d4, # magic number
2, 4, # pcap 2.4 format
0, # UTC timezone for timestamps
0, # “in practice, all tools set it to 0”
65535, # max packet length
228) # LINKTYPE_IPV4, or maybe you want LINKTYPE_RAW
pcapfile.write(pcap_hdr)
如果您不想自己这样做,我没有任何使用库编写pcap文件的经验,但是scapy将是我首先考虑的地方,然后是^{}/^{}的^{}绑定。如果这些都不管用,那就去看看PyPI。在
如果所有这些听起来都超出你的能力,你可能不想这样做。只需运行您的UDP服务器,并使用Wireshark捕获所有发送到它的包。在