如何摆脱被阻止的WinPcap API,即pcap_next_ex()?

时间:2015-07-13 14:17:50

标签: wpf backgroundworker wireshark winpcap

在某些应用程序中,我使用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频道,它不会返回任何内容。

如何摆脱这种障碍?

由于

1 个答案:

答案 0 :(得分:0)

libpcap / WinPcap""读取捕获的数据包"默认情况下,API是阻止的。

你应该:

  1. 在除了接收数据包之外不做任何事情的线程中调用pcap_next_ex(),以便其他线程(包括您可能拥有的任何UI线程)不会阻止;
  2. 使用pcap_setnonblock()pcap_t *置于非阻止模式,使用pcap_getevent()pcap_t *获取可以与HANDLE一起使用的HANDLE在事件循环中{3}}或WaitForMultipleObjects(),如果pcap_next_ex()报告您可以读取数据包,请继续致电pcap_dispatch()直到失败 - 或者只是致电'JSON_CALLBACK' ,它将处理所有可用而无阻塞的数据包。