你已经得到了数据。然而,你得到的是 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”,您应该能够找到您需要的内容。 (最后一个例子套接字模块文档 http://docs.python.org/2/library/socket.html显示如何在 Windows 上使用原始套接字。)
获得数据后,将其保存到pcap
文件并不难。该格式记录在Libpcap 文件格式 http://wiki.wireshark.org/Development/LibpcapFileFormat在 Wireshark 维基百科上。如果您熟悉 stdlibstruct
module,应该很容易弄清楚如何编写这种格式。这是一个简短的示例:
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 http://sourceforge.net/projects/pylibpcap/绑定为libpcap http://www.tcpdump.org//WinPcap http://www.winpcap.org/。如果这些都不起作用,请检查 PyPI。
如果所有这些听起来超出您的能力,您可能不想这样做。只需运行您的 UDP 服务器,并使用 Wireshark 捕获发送给它的所有数据包。