Winpcap代码 - Capture在循环中丢失数据包

时间:2016-12-16 22:18:57

标签: c networking packet-capture winpcap

我有一个使用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不丢失数据包的最佳方法是什么?。

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

1 个答案:

答案 0 :(得分:2)

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

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

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