pcap_getnonblock() 返回 -3

问题描述

我对使用 pcap lib 还很陌生,所以请耐心等待。

我正在尝试使用 pcap_getnonblock 函数,文档说明如下:

pcap_getnonblock() 返回当前的“非阻塞”状态 捕获描述符;它总是在 'savefiles' 上返回 0。如果 有错误,返回PCAP_ERROR并填入errbuf 带有适当的错误消息。
假设 errbuf 至少能够容纳 PCAP_ERRBUF_SIZE 字符。

我得到了 -3 的返回值,而 errbuf 是一个空字符串,我无法理解这样的结果的含义。 我相信这会导致套接错误:10065。 这个问题只发生了一次,我无法重现它,但仍然很高兴找到它的原因以防止在以后的执行中发生。

提前致谢。

解决方法

pcap_getnonblock() can 返回 -3 - 即 PCAP_ERROR_NOT_ACTIVATED。不幸的是,这没有记录;我会解决这个问题。

这里有一个最小的可重现示例来证明这一点:

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

int
main(int argc,char **argv)
{
    pcap_t *pcap;
    char errbuf[PCAP_ERRBUF_SIZE];

    if (argc != 2) {
        fprintf(stderr,"Usage: this_program <interface_name>\n");
        return 1;
    }
    pcap = pcap_create(argv[1],errbuf);
    if (pcap == NULL) {
        fprintf(stderr,"this_program: pcap_create(%s) failed: %s\n",argv[1],errbuf);
        return 2;
    }
    printf("pcap_getnonblock() returns %d on non-activated pcap_t\n",pcap_getnonblock(pcap,errbuf));
    return 0;
}

(是的,这是最小的,因为 1)接口的名称依赖于操作系统,所以它必须是一个命令行参数和 2)如果你没有正确运行程序,它应该让你知道发生了什么,所以你知道你必须做什么才能重现问题)。

也许应该改变pcap_getnonblock()pcap_setnonblock(),这样你可以在激活pcap_t之前设置非阻塞模式,这样,当激活时,它会处于非阻塞模式.然而,它目前不是这样工作的。

即,您使用 pcap_t 分配 pcap_create(),但您没有使用 pcap_activate() 激活它。您需要同时执行这两项操作才能获得可以捕获的 pcap_t