Python在Windows上使用socket读取以太网帧?

2024-04-25 11:39:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图主要使用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-虽然可用的软件包是可以的,但是它们可以与安装程序捆绑在一起。。在


Tags: ipdatarawpacketbindsocketsenderinterface
1条回答
网友
1楼 · 发布于 2024-04-25 11:39:21

Python的socket没有嗅探功能。就这么简单。在

在操作系统中使用网络堆栈的想法是,程序“注册”要传递给它们的特定类型的数据包-通常,这类似于监听IP端口,即比原始以太网数据包高一到两级。在

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

我猜你会很满意pypcap,它可能是PyPi/pip可安装的。在

相关问题 更多 >