Winpcap代码 - 捕获在循环中丢失数据包
问题描述:
我有一个循环捕获数据包与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数据包?
任何帮助将不胜感激。问候。
答
WinPcap将捕获的数据包存储到一个大小受限的环形缓冲区中。 如果数据包的字节数达到环形缓冲区大小,则丢弃旧数据包,以便WinPcap可以存储新数据包。
因此,您应该尽可能频繁地拨打pcap_next_ex
,以便在丢弃之前尽可能多地获取数据包。
在专用线程中调用pcap_next_ex
并在另一个线程中处理数据包是一种很好的做法,因为这种方式可以最频繁地调用pcap_next_ex
。
感谢您的回答,我想知道您对“pcap_loop”或“pcap_dispatch”有什么看法。他们能解决问题吗?否则,正如你所说,我必须更频繁地调用“pcap_next_ex”或创建其他线程来处理数据包。 – KaxperdayTrolling
至于我看到WinPcap的来源,传递给'pcap_loop'(或'pcap_dispatch')的回调在调用'pcap_loop'的同一线程中调用,这意味着您仍然需要一个专用线程来处理'pcap_loop'它可以返回工作,尽快读取环形缓冲区。 – kaitoy