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
。
我对使用 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
。