我有一个用 socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)) 创建的套接字,我使用以下方法将其设置为混杂模式:

struct ifreq ifr;
strncpy((char*)ifr.ifr_name, interface, IF_NAMESIZE);
if(ioctl(sock, SIOCGIFINDEX, &ifr)<0) fail(2);

struct packet_mreq mr;
memset(&mr, 0, sizeof(mr));
mr.mr_ifindex = ifr.ifr_ifindex;
mr.mr_type = PACKET_MR_PROMISC;
if(setsockopt(sock, SOL_PACKET, PACKET_ADD_MEMBERSHIP, &mr, sizeof(mr)) < 0) fail(2);

问题是当我从套接字执行 read() 时,它​​只返回来自或进入我的计算机的数据。

我怎样才能让它读取和处理网络上的所有数据包?

Wireshark 显示所有数据包都很好,所以我知道这不是我的电脑或网卡。 ifconfig 在运行时报告它是 PROMISC

最佳答案

根据 Rob Jones 的建议,尝试使用 Wireshark 之类的工具,以确保您在接口(interface)处收到您期望的数据包。至少这将确认(或否认)您的代码有问题。

还需要确保接口(interface)本身设置为混杂模式。
如果没有,那么您可以使用 ioctl() 来设置它:

ifr.ifr_flags |= IFF_PROMISC;
if( ioctl(sock, SIOCSIFFLAGS, &ifr) != 0 )
{
    // handle error here
}

当您的应用程序运行时,请确保 ifconfig 报告该接口(interface)的 PROMISC 标志。

请注意,这需要以特权用户身份执行。

尝试了所提供的代码。为我工作。当然(由于第 102 行的测试)这只会打印 TCP 流量的详细信息。

关于c - 混杂模式下的数据包套接字仅接收本地流量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1325378/

10-11 02:23
查看更多