如何在回调函数中不使用 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()
。
如果您使用阻塞 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()
。