用AF_PACKET套接字捕获

时间:2019-05-05 15:52:19

标签: c linux sockets raw-sockets

我正在捕获使用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。)。

我的配置中是否缺少任何内容?如果需要,我可以发布整个示例代码,但可能需要数百行,我认为我提交的内容涵盖了我正在做的所有配置。

0 个答案:

没有答案