我如何使libpcap/pcap_loop非阻塞
How do I make libpcap/pcap_loop non-blocking?
我目前使用libpcap在混杂模式下嗅探流量
int main()
{
// some stuff
printf("Opening device: %sn", devname.c_str());
handle = pcap_open_live(devname.c_str(), 65536 , 1 , 0 , errbuf);
if (handle == NULL)
{
fprintf(stderr, "Couldn't open device %s : %s..." , devname.c_str(), errbuf);
return 1;
}
printf(" Donen");
pcap_loop(handle , -1 , process_packet , NULL);
// here run a thread to do some stuff. however, pcap_loop is blocking
return 0;
}
我想添加一个外部线程做一些其他的东西。我如何改变上面的代码,使其非阻塞?
当你在libpcap上使用非阻塞模式时,你必须使用pcap_dispatch,但请注意,pcap_dispatch
可以在阻塞或非阻塞模式下工作,这取决于你如何设置libpcap,要设置libpcap在非阻塞模式下工作,你必须使用pcap_setnonblock
:
int pcap_setnonblock(pcap_t *p, int nonblock, char *errbuf);
阻塞和非阻塞之间的区别不是永远运行的循环,而是阻塞函数pcap_dispatch
等待数据包并仅在收到该数据包时返回,然而,在非阻塞模式下,函数立即返回并且回调必须处理数据包。
http://www.tcpdump.org/manpages/pcap_setnonblock.3pcap.html在"非阻塞"模式下,尝试从捕获中读取如果当前没有数据包,则使用pcap_dispatch()的描述符将可读,立即返回0,而不是阻塞等待数据包到达。Pcap_loop()和pcap_next()则不会在"非阻塞"模式下工作
pcap_loop将一直持续到所有输入结束。如果不想要这种行为,可以在循环中调用pcap_dispatch。根据定义,pcap_loop永远不会返回,它意味着总是搜索更多的数据。
我使用pcap_next_ex
。它返回一个结果,指示是否读取数据包。这样我就可以管理我自己的线程。请看下面的例子。pcap_open
中的read_timeout
也会影响此功能
相关文章:
- 为什么我不能在 FOR LOOP 中使用 i/10,C++?
- Arduino:for/while/if在void setup()或void loop()之前?——错误:之前需要不合格
- "Ill-defined for-loop - loop executes infinitely" (MSVC C6295)
- Arduino:在 loop() 和自定义函数中运行相同的代码时出现问题
- 在 cmake 中使用 Pcap++ 库
- 使用 pcap 捕获双 VLAN 流量
- g++ -O3 为 loop 创建了奇怪的指令 - 两个具有相同 asm 的版本
- For-loop或std::any_of,我应该使用哪一个?
- 从libtins获取可读的PCAP转储
- 什么是'do while loop'的真实应用?
- C/C++ 中的高效 pcap 解析器
- 如何使用 pcap.h c++ 按 ip 过滤
- loop() 函数之外的无限循环
- 如何在 Arduino 延迟期间在 void loop() 中使用 serial.available()?
- 在"for loop"中使用GOTOXY定位
- 如果用户输入数字 <0,我如何停止" while loop "?
- 如何在 Skylake 架构上最大化 sqrt-heavy loop 的指令级并行性?
- 在这种情况下,我将如何继续 1 到 360 的"for loop"处理指针和地址?
- C++ For Loop在过程中被跳过了.如何解决?
- 如何增加"for loop"呈现的结果?