3

这两个函数都是无限循环,

并且程序在同一线程中调用一次就会挂起。

gtk_main(); 
...
pcap_loop(adhandle, 0, packet_handler, NULL);

当我点击“开始”按钮时,我想pcap开始工作;如果我按下“停止”按钮,就pcap 停止

如何创建子线程并pcap_loop(adhandle, 0, packet_handler, NULL);改为运行?

4

2 回答 2

3

除非我遗漏了什么,否则您的问题是 GTK+ 和 libpcap 都是围绕从主循环触发的事件组织的。不看文档,我不知道 GTK+,但是 libpcap 还有另一种操作模式:您可以使用pcap_next()pcap_next_ex()不放弃对程序流的控制。

g_timeout_add()应该可以使用or注册一个定期调用这两个函数之一的函数g_idle_add(),从而完全消除了使用线程和互斥机制的麻烦。

于 2010-05-08T11:00:22.520 回答
1

查看g_thread_create(). 另请阅读本教程这篇博文,了解有关多线程 GTK 程序的更多信息。

gtk_main()基本上,当您构建用户界面并启动程序时,您首先要调用。然后在“开始”按钮的回调中,创建一个新线程g_thread_create(),您可以在其中调用pcap_loop().

“停止”按钮有点困难,因为 GLib 不允许您从不同线程中断线程。您必须创建一些信号机制;例如,由 a 保护的布尔中止标志GMutex。在您的停止按钮回调中,使用 锁定标志g_mutex_lock()、设置它并使用 解锁g_mutex_unlock()。在您的packet_handler中,还要锁定标志、读取它并解锁它。如果设置了标志,则调用您调用的任何内容以使 pcap 跳出循环。

于 2010-05-08T10:07:13.613 回答