簡體   English   中英

Python在Windows上使用套接字讀取以太網幀嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM