我有一个用 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/