我正在尝试主要使用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
- 功能包可以,但它们可以与安装程序捆绑在一起..
答案 0 :(得分:0)
Python的套接字并没有嗅探功能。就这么简单。
在您的操作系统中建立网络堆栈的想法是程序"注册"对于要传递给它们的特定类型的数据包 - 通常,这类似于侦听IP端口,即。原始以太网数据包之上一到两层。
要获取所有原始以太网数据包,您的操作系统的网络堆栈需要某种驱动程序/接口来支持您。这就是为什么wireshark需要WinPcap的原因。
我的猜测是你会对pypcap非常满意,这可能是PyPi / pip可安装的。