在某些应用程序中,我使用WinPcap库来捕获数据包。我正在使用WPF开发应用程序。在这里,我使用backgroundworker在while循环中调用pcap_next_ex()API。这里pcap_next_ex被阻止了,它没有响应。所以我们的wpf应用程序正在挂起。如何杀死后台工作者以及如何摆脱Blocked API?
/*In WPF Application*/
worker.WorkerReportsProgress = true;
worker.WorkerSupportsCancellation = true;
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProcessChanged);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
public void Start_click(object sender, RoutedEventArgs e)
{
worker.RunWorkerAsync();
}
private void worker3_DoWork(object sender, DoWorkEventArgs e)
{
while(1)
{
status=getpacket();
if(worker.cancelpending)
{
e.cancel=true;
return;
}
}
}
/*In Vc++ dll*/
int status getpacket()
{
status=pcap_next_ex(pPcap,header, data);
}`
我的问题是这里pcap_next_ex()阻塞了。如果我设置为56频道,它不会返回任何内容。
如何摆脱这种障碍?
由于
答案 0 :(得分:0)
libpcap / WinPcap""读取捕获的数据包"默认情况下,API是阻止的。
你应该:
pcap_next_ex()
,以便其他线程(包括您可能拥有的任何UI线程)不会阻止; pcap_setnonblock()
将pcap_t *
置于非阻止模式,使用pcap_getevent()
为pcap_t *
获取可以与HANDLE
一起使用的HANDLE
在事件循环中{3}}或WaitForMultipleObjects()
,如果pcap_next_ex()
报告您可以读取数据包,请继续致电pcap_dispatch()
直到失败 - 或者只是致电'JSON_CALLBACK'
,它将处理所有可用而无阻塞的数据包。