问题描述
我对使用 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
。