pcap_set_buffer_size中的问题

ben*_*iga 5 c linux pcap libpcap

#include <stdio.h>
#include <stdlib.h>
#include <pcap.h>

#define BUFFER_SIZE 65535

char errbuf[PCAP_ERRBUF_SIZE];

int main(int argc, char **argv)
{
    int d;
    pcap_if_t *alldevsp;
    pcap_t *pkt_handle;

    if((pcap_findalldevs(&alldevsp,errbuf))==-1)
    {
        printf("findalldevices: %s\n",errbuf);
        exit(1);
    }
    printf("Availabel network devices are\n");
    pcap_if_t *temp = alldevsp;
    while((temp)!=NULL)
    {
        printf("%s: %s\n",(temp)->name,(temp)->description);
        (temp)=(temp)->next;
    }
    pcap_freealldevs(alldevsp);

    pkt_handle = pcap_create("wlan1",errbuf);
    if(pkt_handle==NULL)
    {
        printf("create: %s\n",errbuf);
        exit(1);
    }


    if((pcap_set_rfmon(pkt_handle, 1))!=0)
    {
        printf("Monitor mode could not be set\n");
        exit(1);
    }

    if((pcap_set_buffer_size(pkt_handle, BUFFER_SIZE))!=0)
        {
        printf("ERROR\n");
        exit(1);
    }

    if((d=(pcap_activate(pkt_handle)))!=0)
    {
        if(d==PCAP_ERROR_RFMON_NOTSUP)
            printf("%d : PCAP_ERROR_RFMON_NOTSUP\n",d);
        if(d==PCAP_WARNING)
            printf("%d : PCAP_WARNING\n",d);
        if(d==PCAP_ERROR)
            printf("%d : PCAP_ERROR\n",d);
        pcap_perror(pkt_handle,"Activate");
        exit(1);
    }
    printf("d=%d\n",d);

    while(1)
    {
        scanf("%d",&d);
        if(d==-1)
            break;
    }

    pcap_close(pkt_handle);
    printf("Bye\n");

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

使用以下命令运行上述程序时:
gcc -Wall -lpcap sample.c -o sample
我得到以下错误:
-1:PCAP_ERROR
激活:不能mmap rx ring:无效参数

但是,如果我注释掉包含"pcap_set_buffer_size()"函数调用的代码部分,该程序可以正常工作.

那么,pcap_set_buffer_size()有什么问题?
为什么导致"pcap_activate()"失败?

alk*_*alk 12

对于最近的64位Linux:

任何等于或大于65616的缓冲区大小都应该这样做.

对于价值是如何计算的,请参阅执行create_ring()pcap-linux.clibpcap源.

默认值为2*1024*1024 = 2097152.

Windows上的默认缓冲区大小为1000000.


更新:

要设置的缓冲区大小是pcap_set_buffer_size()指(ring-)缓冲区,它存储已接收的包.最佳大小取决于用例和经济实惠的系统资源(不可分页的内存).

有关接收缓冲区大小的详细信息请参见以下语句 man pcap:

到达捕获的数据包存储在缓冲区中,因此应用程序一到达就不必读取它们.在某些平台上,可以设置缓冲区的大小; 太小的大小可能意味着,如果捕获太多数据包并且快照长度不限制缓冲的数据量,如果缓冲区在应用程序可以从其中读取数据包之前填满,则可以丢弃数据包,同时太大的大小可能会使用更多不可分页的操作系统内存,而不是防止数据包被丢弃.


更新1:

无论如何,缓冲区的大小应该是为使用中的句柄设置的捕捉长度,加上正确对齐缓冲区本身所需的一些字节,否则激活句柄最终会如原始问题中所述.

可以使用检索手柄的当前捕捉长度pcap_snapshot().默认捕捉长度为65535字节.