gpt4 book ai didi

linux - 使用 linux 原始套接字捕获传出帧是否需要 ETH_P_ALL

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:09:45 24 4
gpt4 key购买 nike

在 Linux(2.6.39 内核)上,使用原始套接字,我试图接收系统本身发出的所有多播帧。

我创建了一个原始套接字 socket(AF_PACKET, SOCK_RAW, htons(ETH_P_IP));,并从套接字中读取帧,丢弃目标地址不以 ' 开头的帧01:00:5e'。我知道有更好的方法来锁定 UDP,但我一直在玩,我注意到了这个特殊问题,所以下面是这个问题的唯一范围。

我可以捕获所有四处传播的多播数据包,除了由运行程序的系统产生的数据包。我可以让它开始捕获系统自己的数据包(以及进入它的数据包)的唯一方法是将 socket() 调用中的 protocol 参数更改为 htons(ETH_P_ALL)。我以这种方式捕获的数据包仍然具有 0x0800 类型,即 ETH_P_IP

所以我想知道这个 - 使用 ETH_P_ALL 是捕获与传入帧相同的传出帧的唯一方法吗?有没有其他方法可以指定捕获的数据包的方向?

packet(7) 在这个主题上有点含糊,只说:

All incoming packets of that protocol type will be passed to the packet socket before they are passed to the protocols implemented in the kernel.

最佳答案

使用 libpcap 捕获所有传入和传出的数据包,并使用 pcap_setdirection() 指定捕获数据包的方向。libpcap 比原始套接字更快,因为它在内部使用 PF_PACKET。

关于linux - 使用 linux 原始套接字捕获传出帧是否需要 ETH_P_ALL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20864962/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com