繁体   English   中英

无法使用libpcap捕获数据包

[英]Cannot capture the packet using libpcap

我是一个新的使用libpcap。

我正在使用这个库捕获数据包和我写入捕获数据包的代码。

我正在点击的接口总是充满了arp数据包,所以始终有数据包进入接口。但是我无法点击这些数据包。 界面已启动并正在运行。 我在pcap_open_live函数上没有错误。

代码在C中。我在FreeBSD10机器上运行此代码32位。

void captutre_packet(char* ifname , int snaplen) {

    char ebuf[PCAP_ERRBUF_SIZE];
    int pflag = 0;/*promiscuous mode*/
    snaplen  = 100;
    pcap_t* pcap =  pcap_open_live(ifname, snaplen, !pflag , 0, ebuf);
    if(pcap!=NULL) {
            printf("pcap_open_live for %s  \n" ,ifname );   
    }

    int fd = pcap_get_selectable_fd(pcap);
    pcap_setnonblock(pcap, 1, ebuf);

    fd_set fds;
    struct timeval tv;

    FD_ZERO(&fds);
    FD_SET(fd, &fds);

    tv.tv_sec = 3;
    tv.tv_usec = 0;
    int retval = select(fd + 1, &fds, NULL, NULL, &tv);

    if (retval == -1)
            perror("select()");
        else if (retval) {
            printf("Data is available now.\n");
            printf("calling pcap_dispatch \n");
            pcap_dispatch(pcap , -1 , (pcap_handler) callback , NULL);
        }
        else
            printf("No data within 3 seconds.\n");
 }  
    void
    callback(const char *unused, struct pcap_pkthdr *h, uint8_t *packet)
    {
            printf("got some packet \n");
    }

我总是得到retval为0,这是超时。 我不知道幕后发生了什么我遵循教程,他们也完全一样,我不知道我错过了什么。

我还想了解一旦接收到以太网层的数据包如何被复制到这个打开的bpf套接字/设备(使用pcap_open_live)以及如何将缓冲区从内核空间复制到用户空间?

我们可以在数据包中使用多长时间直到内核消耗或拒绝数据包?

pcap_open_live()调用提供0作为数据包缓冲区超时值(第四个参数)。 libpcap没有指定0的值意味着什么,因为在不同的操作系统上,不同的数据包捕获机制会以不同的方式处理该值。

在使用BPF的系统上,例如BSD和macOS,它意味着“在提供数据包之前等待数据包缓冲区完全满。如果数据包缓冲区很大(在FreeBSD上默认为256K左右),并且数据包很小(对于ARP数据包为60个字节),缓冲区可能需要花费大量时间来填充 - 比您传递给select()的超时时间更长。

最好将超时值设置在100毫秒到1秒之间,因此传递的参数介于100和1000之间,而不是0。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM