我有一个使用pcap_next_ex捕获数据包的循环,并且在每次迭代中我根据处理数据包执行了很多函数调用。这个东西可以通过循环中的Sleep()调用来模拟。然后我在pcap_next_ex()循环中调用Sleep会发生什么?。
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函数来捕获&#34;非阻塞&#34;模式并为每个数据包调用一个事件...使用winpcap不丢失数据包的最佳方法是什么?。
任何帮助将不胜感激。问候。
答案 0 :(得分:2)
WinPcap将捕获的数据包存储到大小有限的环形缓冲区中。 如果数据包的字节数达到环形缓冲区大小,则丢弃旧数据包,以便WinPcap可以存储新数据包。
因此,您应该尽可能频繁地调用pcap_next_ex
,以便在丢弃之前尽可能多地获取数据包。
在专用线程中调用pcap_next_ex
并在另一个线程中处理数据包是一种很好的做法,因为这种方式可以最频繁地调用pcap_next_ex
。