[英]Python Read ethernet frames using socket on Windows?
我正在嘗試主要使用socket
讀取以太網(IEEE 802.2 / 3)幀。 該應用程序應該僅嗅探以太網幀,並根據內容對其進行操作。 但是,幾乎沒有關於如何在Windows上執行此操作的信息,默認(unix方式)為socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(0x0800))
。 這顯然在winsock中不存在。 那么我該如何嗅探eth幀呢?
我懷疑我需要使用socket.bind()
而不是IP綁定到MAC。
我當前的代碼:
def _receive(interface): #Receive Eth packets.
#Interface = '192.168.0.10'
sock2 = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_RAW)
sock2.setsockopt(socket.SOL_IP, socket.IP_HDRINCL, 1))
sock2.bind((interface, 0))
while True:
data, sender = sock2.recvfrom(1500)
handle_data(sender, data)
讓我無處可去。 我在Wireshark中看到本地連接上的數據包,但是在python中沒有收到。
在Linux上,我可以執行sock_raw = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_802_2))
,然后進行綁定和setsockopt(sock_raw, SOL_PACKET, PACKET_ADD_MEMBERSHIP, &mreq, sizeof(mreq))
我不想不必依賴太多的外部庫,因為它應該是分布式的,因此非常輕巧。 pip install
軟件包雖然可以,但可以與安裝程序捆綁在一起。
Python的套接字不附帶嗅探功能。 就那么簡單。
在操作系統中具有網絡堆棧的想法是,程序為要傳送給它們的特定類型的數據包“注冊” –通常,這類似於偵聽IP端口。 比原始以太網數據包高一到兩個級別。
要獲取所有原始的以太網數據包,操作系統的網絡堆棧需要某種驅動程序/接口來支持您。 這就是wireshark需要WinPcap的原因。
我的猜測是您對pypcap非常滿意,它可能是PyPi / pip可安裝的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.