Python在Windows上使用套接字读取以太网帧?
我正尝试读取主要使用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软件包虽然可以,但它们可以与安装程序捆绑在一起。
Python的套接字不具有嗅探功能。就那么简单。
在您的操作系统中有一个网络堆栈的想法是程序“注册”特定类型的数据包将被传送给他们 - 通常,这就像在一个IP端口上收听,即。比原始以太网数据包高出一到两个等级。
要获取所有原始以太网数据包,您的操作系统的网络堆栈需要某种驱动程序/接口来支持您。这就是wireshark需要WinPcap的原因。
我的猜测是你会很高兴与pypcap,这可能是PyPi/pip可安装。
它不是 - 它实际上需要在mingw中编译才能正常工作。我不知道它是如何便携的,一旦'安装'它在我的机器上。看起来像很多模糊的工作。我会尝试在明明建造它 – enrm