你已经得到了数据。但是,您得到的是 UDP 数据包和源地址;如果您想要带有 IPv4 和 UDP 标头的完整原始数据包,那就不同了。
在某些平台上,您可以将普通的 UDP 套接字设置为IP_HDRINCL
,或者有其他等效项。如果你这样做,每个recvfrom
都会在数据中包含标题,所以你已经得到了你想要的一切。
在其他平台上,您可以SOCK_RAW
使用SOCK_DGRAM
. 你可以用原始套接字做什么变化很大。在许多 Unix 平台上,您可以使用IPPROTO_UDP
with SOCK_RAW
,然后bind
使用普通的 UDP 地址和端口,尽管可能有限制,并且它们在每个平台上都不同。例如,在 OS X 上,您必须是 root 才能创建原始套接字,并且您只能将原始套接字绑定到单接口地址(意味着没有''
/ INADDR_ANY
/ '0.0.0.0'
)。如果你用谷歌搜索“SOCK_RAW Python”和“SOCK_RAW”,你应该能够找到你需要的东西。(套接字模块文档中的最后一个示例显示了如何在 Windows 上使用原始套接字。)
获得数据后,将其保存到pcap
文件中并不难。该格式记录在Wireshark Wiki的LibpcapFileFormat中。如果您熟悉 stdlibstruct
模块,应该很容易弄清楚如何编写这种格式。这是一个简短的示例:
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
我会首先查看,然后是/的python-libpcap
绑定。如果这些都不起作用,请检查 PyPI。libpcap
WinPcap
如果所有这些听起来都超出了您的想象,那么您可能不想以这种方式做事。只需运行您的 UDP 服务器,并使用 Wireshark 捕获发送给它的所有数据包。