我试图主要使用socket
来读取以太网(ieee802.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的socket没有嗅探功能。就这么简单。在
在操作系统中使用网络堆栈的想法是,程序“注册”要传递给它们的特定类型的数据包-通常,这类似于监听IP端口,即比原始以太网数据包高一到两级。在
要获取所有原始以太网数据包,您的操作系统的网络堆栈需要某种驱动程序/接口来支持您。这就是为什么wireshark需要WinPcap。在
我猜你会很满意pypcap,它可能是PyPi/pip可安装的。在
相关问题 更多 >
编程相关推荐