gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:00:39 46 4
gpt4 key购买 nike

如果您使用阻塞式 pcap_loop()pcap_dispatch() 通过合适的回调 fn 处理传入的数据包数据,您可能需要中断这些函数,即让他们返回。

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

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

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

我阅读了手册页,其中提到了一些关于使用信号的内容,但这些都是特定于非可移植操作系统的。

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

最佳答案

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 的事件句柄,然后在该句柄上使用 SetEvent()调用 pcap_breakloop()

关于c - 如何在不在回调函数中使用 pcap_breakloop() 的情况下从 pcap_loop() 或 pcap_dispatch() 返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58821647/

46 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com