如何在回调函数中不使用 pcap_breakloop() 的情况下从 pcap_loop() 或 pcap_dispatch() return

How to return from pcap_loop() or pcap_dispatch() without using pcap_breakloop() within the callback function

如果您使用阻塞 pcap_loop()pcap_dispatch() 通过合适的回调 fn 处理传入的数据包数据,您可能需要突破这些功能,即让它们进入 return.

现在 pcap_breakloop() 是执行此操作的一种方法,但如果您从另一个执行线程调用它,那将不起作用。您可以从 pcap_loop()/pcap_dispatch() 中指定的回调 fn 中调用 pcap_breakloop(),但这只是您可以保证 pkt 将触发回调的一个选项。

如何在没有传入数据包触发回调 fn 的情况下中断 pcap_loop()pcap_dispatch()

如果 pcap_loop()/pcap_dispatch() 在此用例场景中被阻止,那么您将要从其他线程解除阻止。但是您不能从不同的执行线程调用 pcap_breakloop()

我阅读了手册页,它提到了一些关于使用信号的内容,但这些是不可移植的 OS 具体的。

我能看到的解决此问题的唯一解决方法是使用 pcap_dispatch() 但处于解锁模式 (pcap_setnonblock())。然后,您可以将 pcap_dispatch() 置于紧密的 while 循环中。这可行,但我认为能够从另一个线程礼貌地询问 pcap_loop()pcap_dispatch() 到 return 会更优雅?

How can one break a pcap_loop() or pcap_dispatch() in the absence of an incoming packet to trigger the callback fn?

在 UN*Xes 上,捕获 SIGUSR1 等信号,让信号处理程序不执行任何操作,然后在调用 pcap_breakloop() 后调用 pthread_kill() 将该信号发送到正在执行 pcap_dispatch()pcap_loop() 的线程。当你捕捉到信号时,不要指定SA_RESTART;这样,信号将中断系统调用,例如 libpcap 读取捕获数据包的调用。这是特定于 UN*X 的,但不特定于特定版本的 UN*X。

在 Windows 上,使用 pcap_getevent() 获取 pcap_t 的“事件句柄”,并在调用 pcap_breakloop() 后对该句柄使用 SetEvent()