pcap_getnonblock() returns -3

pcap_getnonblock() returns -3

我对使用 pcap 库还很陌生,所以请多多包涵。

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

pcap_getnonblock() returns the current 'non-blocking' state of the capture descriptor; it always returns 0 on 'savefiles' . If there is an error, PCAP_ERROR is returned and errbuf is filled in with an appropriate error message.
errbuf is assumed to be able to hold at least PCAP_ERRBUF_SIZE chars.

返回-3,errbuf是空字符串,我不明白这样的结果是什么意思。 我相信这会导致套接字错误:10065。 这个问题只发生过一次,我无法重现,但如果能找到它的原因以防止它在未来的执行中发生,那就太好了。

提前致谢。

pcap_getnonblock() 可以 return -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)接口的名称是 OS 依赖的,所以它必须是命令行参数,并且 2)如果你不 运行正确编程,它应该让你知道发生了什么,这样你就知道你必须做什么才能重现问题)。

也许应该更改pcap_getnonblock()pcap_setnonblock(),以便您可以在激活pcap_t之前设置非阻塞模式,以便在激活时处于非阻塞状态阻塞模式。但是,它目前无法以这种方式工作。

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