2016-07-25 34 views
0

我正尝试读取主要使用socket的以太网(IEEE 802.2/3)帧。 该应用程序只需嗅探以太网帧并根据内容采取行动。但是,几乎没有关于如何在Windows上执行此操作的信息,默认(unix方式)为socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(0x0800))。这在winsock中显然不存在。那么,我如何嗅探eth帧呢?Python在Windows上使用套接字读取以太网帧?

我怀疑我需要绑定到MAC使用socket.bind()而不是IP。

我当前的代码:

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的本地连接的数据包,但它不是在蟒蛇拿起..

在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 -able软件包虽然可以,但它们可以与安装程序捆绑在一起。

回答

0

Python的套接字不具有嗅探功能。就那么简单。

在您的操作系统中有一个网络堆栈的想法是程序“注册”特定类型的数据包将被传送给他们 - 通常,这就像在一个IP端口上收听,即。比原始以太网数据包高出一到两个等级。

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

我的猜测是你会很高兴与pypcap,这可能是PyPi/pip可安装。

+0

它不是 - 它实际上需要在mingw中编译才能正常工作。我不知道它是如何便携的,一旦'安装'它在我的机器上。看起来像很多模糊的工作。我会尝试在明明建造它 – enrm

相关问题