【问题标题】:Winpcap code - Capture loses packets in loopWinpcap 代码 - 捕获在循环中丢失数据包
【发布时间】:2016-12-19 15:53:25
【问题描述】:

我有一个循环来使用 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 函数以“非阻塞”模式捕获数据包,并为每个到来的数据包调用一个事件......使用 winpcap 不丢失数据包的最佳方法是什么?。

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

【问题讨论】:

  • 我遇到了同样的问题。我没有立即处理 packet_data,而是将 packet_data 推入队列并在其他线程中处理 packet_data。

标签: c networking packet-capture winpcap


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的回答,我想知道您对“pcap_loop”或“pcap_dispatch”的看法。他们能解决问题吗?否则正如你所说,我必须更频繁地调用“pcap_next_ex”或创建其他线程来处理数据包。
  • 至于我看到的WinPcap的来源,传递给pcap_loop(或pcap_dispatch)的回调在调用pcap_loop的同一个线程中调用,这意味着你仍然需要一个pcap_loop 的专用线程,以便它可以尽快回到工作中读取环形缓冲区。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多