如果使用阻塞的pcap_loop()
或pcap_dispatch()
通过适当的回调fn处理传入的数据包数据,则可能需要脱离这些功能,即让它们返回。
现在pcap_breakloop()
是执行此操作的一种方法,但是如果您从另一个执行线程调用它,则该方法将无效。您可以从pcap_breakloop()
/ pcap_loop()
中指定的回调fn内调用pcap_dispatch()
,但这仅是可以保证pkt将触发回调的选项。
[在没有输入数据包的情况下如何中断pcap_loop()
或pcap_dispatch()
以触发回调fn?
如果在这种用例场景中pcap_loop()
/ pcap_dispatch()
被阻止,那么您将希望从其他线程中取消阻止。但是您不能从不同的执行线程调用pcap_breakloop()
。
我阅读了手册页,其中提到了一些有关使用信号的内容,但是这些都是非便携式操作系统专用的。
我可以看到的唯一解决方法是使用pcap_dispatch()
,但处于解锁模式(pcap_setnonblock()
)。然后,您可以将pcap_dispatch()
置于紧凑的while循环中。这有效,但是我认为能够礼貌地要求pcap_loop()
或pcap_dispatch()
从另一个线程返回会更优雅?
[在没有传入数据包时如何中断pcap_loop()或pcap_dispatch()来触发回调fn?
在UN * Xes上,捕获诸如SIGUSR1
的信号,让信号处理程序不执行任何操作,然后在调用pcap_breakloop()
之后,调用pthread_kill()
以将该信号发送到正在执行pcap_dispatch()
或[ C0]。当您捕获信号时,请not指定pcap_loop()
;否则,请选择SA_RESTART
。这样,该信号将中断系统调用,例如由libpcap进行的调用,以读取捕获的数据包。这是特定于UN * X的,但并非特定于特定版本的UN * X。
在Windows上,使用pcap_getevent()
获取“pcap_t, and use
SetEvent()on that handle after calling
pcap_breakloop()`的事件句柄。