2016-12-16 97 views
0

我有一个循环捕获数据包与pcap_next_ex并在每次迭代中,我根据处理数据包做了很多函数调用。这些东西可以通过循环中的Sleep()调用来模拟。然后发生什么,然后我在pcap_next_ex()循环中调用Sleep ?.Winpcap代码 - 捕获在循环中丢失数据包

pcap_pkthdr* header = NULL; 

UCHAR* content = NULL; 

pcap = pcap_open(adapterName.c_str(), 65536, PCAP_OPENFLAG_PROMISCUOUS, 1000, NULL, NULL); 

//Set to nonblock mode? 

while (INT res = pcap_next_ex(pcap, &header, const_cast<const UCHAR**>(&content)) >= 0) 
{ 
    if (res != FALSE) 
    { 
     if (content) 
     { 
      //Here i do the stuff which I will simulate with a Sleep() call 

      Sleep(200); 
     } 
    } 
} 

我已经看到它使用pcap_next_ex和保存数据包的载体后来与另一个线程来对待他们的代码,这种方法主要是减少了的东西的时候,但不会说服了我很多。我可以用这个方法吗?

我想使用其他winpcap函数捕获在“非阻塞”模式下的数据包,并调用每个数据包的事件来...什么是最好的方法,不丢失与winpcap数据包?

任何帮助将不胜感激。问候。

回答

1

WinPcap将捕获的数据包存储到一个大小受限的环形缓冲区中。 如果数据包的字节数达到环形缓冲区大小,则丢弃旧数据包,以便WinPcap可以存储新数据包。

因此,您应该尽可能频繁地拨打pcap_next_ex,以便在丢弃之前尽可能多地获取数据包。

在专用线程中调用pcap_next_ex并在另一个线程中处理数据包是一种很好的做法,因为这种方式可以最频繁地调用pcap_next_ex

+0

感谢您的回答,我想知道您对“pcap_loop”或“pcap_dispatch”有什么看法。他们能解决问题吗?否则,正如你所说,我必须更频繁地调用“pcap_next_ex”或创建其他线程来处理数据包。 – KaxperdayTrolling

+0

至于我看到WinPcap的来源,传递给'pcap_loop'(或'pcap_dispatch')的回调在调用'pcap_loop'的同一线程中调用,这意味着您仍然需要一个专用线程来处理'pcap_loop'它可以返回工作,尽快读取环形缓冲区。 – kaitoy