Python在Windows上使用套接字读取以太网帧?

时间:2016-07-25 10:28:42

标签: python windows sockets ethernet

我正在尝试主要使用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 - 功能包可以,但它们可以与安装程序捆绑在一起..

1 个答案:

答案 0 :(得分:0)

Python的套接字并没有嗅探功能。就这么简单。

在您的操作系统中建立网络堆栈的想法是程序"注册"对于要传递给它们的特定类型的数据包 - 通常,这类似于侦听IP端口,即。原始以太网数据包之上一到两层。

要获取所有原始以太网数据包,您的操作系统的网络堆栈需要某种驱动程序/接口来支持您。这就是为什么wireshark需要WinPcap的原因。

我的猜测是你会对pypcap非常满意,这可能是PyPi / pip可安装的。