如何从pcap_loop()或pcap_dispatch()返回而不在回调函数中使用pcap_breakloop()

问题描述 投票:1回答:1

如果使用阻塞的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()从另一个线程返回会更优雅?

c pcap
1个回答
0
投票

[在没有传入数据包时如何中断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 useSetEvent()on that handle after calling pcap_breakloop()`的事件句柄。

© www.soinside.com 2019 - 2024. All rights reserved.