我正在捕获使用ETH_P_ALL创建AF_PACKET / SOCK_RAW套接字并启用混杂模式的数据包,并切断了大多数内容,重要的代码如下,应该告诉您如何配置套接字:
sockfd = socket( AF_PACKET, SOCK_RAW, htons(ETH_P_ALL) );
<cut>
socket_address.sll_family = AF_PACKET;
socket_address.sll_ifindex = if_nametoindex(target_if);
if( socket_address.sll_ifindex == 0 ) {
perror("Can't find the interface.");
exit( EXIT_FAILURE );
}
socket_address.sll_protocol = htons(ETH_P_ALL);
if( bind(sockfd, (struct sockaddr*)&socket_address,sizeof(socket_address)) == -1 ) {
perror( "bind()" );
exit( EXIT_FAILURE );
}
<cut>
struct ifreq ifr;
memset(&ifr,0,sizeof(struct ifreq));
strcpy( ifr.ifr_name, target_if );
ifr.ifr_flags |= IFF_PROMISC;
ifr.ifr_flags |= IFF_UP;
if( ioctl( sockfd, SIOCSIFFLAGS, &ifr ) == -1 ) {
perror( "can't set to promiscuous" );
exit( EXIT_FAILURE );
}
<cut>
主循环类似于(其中msgs是有效数组,VLEN是有效值):
do{
retval = recvmmsg( sockfd, msgs,VLEN,0, &timeout);
if( retval > 0) {
<cut>
}
<cut>
} while( running );
我期望这段代码将捕获进入接口的所有数据包,但是我注意到ethtool的rx_packets_phy的值始终比我的代码可以捕获的数据包数量大得多(例如,如果我让该应用运行5分钟,我可以捕获4万个pkts,而rx_packets_phy在同一时期又增加了5k,达到45k。)。
我的配置中是否缺少任何内容?如果需要,我可以发布整个示例代码,但可能需要数百行,我认为我提交的内容涵盖了我正在做的所有配置。