我目前正在使用libpcap在混杂模式下嗅探stream量
int main() { // some stuff printf("opening device: %sn",devname.c_str()); handle = pcap_open_live(devname.c_str(),65536,1,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; }
我想添加一个外部线程来做一些其他的东西。 如何更改上面的代码使其成为非阻塞?
监测rs232stream量
当你在libpcap上使用非阻塞模式时,你必须使用pcap_dispatch,但是请注意, pcap_dispatch可以在阻塞或非阻塞模式下工作,这取决于你如何设置libpcap,设置libpcap在非阻塞中工作,函数pcap_setnonblock :
int pcap_setnonblock(pcap_t *p,int nonblock,char *errbuf);
阻塞和非阻塞之间的区别不是永久运行的循环,而是阻塞函数pcap_dispatch等待数据包,并且只有在接收到数据包时才会返回,但是,在非阻塞模式下,函数立即返回,回调函数必须处理数据包。
在“非阻塞”模式下,尝试从捕获描述符中读取pcap_dispatch(),如果当前没有数据包可读取,立即返回0,而不是阻止等待数据包到达。 pcap_loop()和pcap_next()不能在“非阻塞”模式下工作。
http://www.tcpdump.org/manpages/pcap_setnonblock.3pcap.html
pcap_loop打算继续,直到所有的输入结束。 如果您不想要这种行为,请改为在循环中调用pcap_dispatch。 根据定义,pcap_loop永远不会返回,它的意思是总是搜索更多的数据。
我使用pcap_next_ex它返回一个结果,指示是否有数据包被读取。 这样我管理收购我自己的线程。 在这里看到一个例子。 pcap_open中的pcap_open也会影响这个函数。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。