我有一个循环捕获数据包与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数据包?
任何帮助将不胜感激。问候。
感谢您的回答,我想知道您对“pcap_loop”或“pcap_dispatch”有什么看法。他们能解决问题吗?否则,正如你所说,我必须更频繁地调用“pcap_next_ex”或创建其他线程来处理数据包。 – KaxperdayTrolling
至于我看到WinPcap的来源,传递给'pcap_loop'(或'pcap_dispatch')的回调在调用'pcap_loop'的同一线程中调用,这意味着您仍然需要一个专用线程来处理'pcap_loop'它可以返回工作,尽快读取环形缓冲区。 – kaitoy