您已經掌握了相關數據。但是,你得到的是UDP數據包和源地址;如果您想要完整的原始數據包,使用IPv4和UDP標頭,則不同。
在某些平臺上,你可以設置一個正常的UDP套接字爲IP_HDRINCL
,或者還有其他的等價物。如果你這樣做,每個recvfrom
將包括數據的報頭,所以你已經得到了你想要的一切。
在其他平臺上,您可以使用SOCK_RAW
而不是SOCK_DGRAM
。你可以用原始套接字做什麼變化很大。在許多Unix平臺上,可以使用IPPROTO_UDP
與SOCK_RAW
,然後bind
爲正常的UDP地址和端口,雖然可能有限制,並且它們在每個平臺上都不相同。例如,在OS X上,您必須是root用戶才能創建原始套接字,並且您只能將原始套接字綁定到單接口地址(即沒有0/INADDR_ANY
/'0.0.0.0'
)。如果谷歌爲「SOCK_RAW的Python」和「SOCK_RAW」你應該能夠找到你所需要的。 (sockets module docs中的最後一個示例顯示瞭如何在Windows上使用原始套接字。)
獲得數據後,將其保存到pcap
文件並不困難。該格式在The 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
將是我首先關注的地方,然後python-libpcap
綁定爲libpcap
/WinPcap
。如果沒有這些工作,檢查PyPI。
如果所有這些聽起來超出了你的意思,你可能不想這樣做。只需運行你的UDP服務器,並使用Wireshark捕獲所有發送給它的數據包。
你的問題不是很清楚。你在這裏做什麼應該很好。假設沒有其他任何東西綁定到'('',54345)',它將接收發送到該端口的每個數據報並將其打印到'stdout',這樣您就可以將腳本的輸出重定向到一個文件並使用'scapy'或任何其他你要。所以...這是不是你想要做的事? – abarnert
感謝您的快速響應.. recvfrom的輸出形式爲('data',('add',54345))。可以保存爲.pcap文件中的完整數據包嗎? – OiaSam