Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winpcap代码-捕获在循环中丢失数据包_C_Networking_Packet Capture_Winpcap - Fatal编程技术网

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

Winpcap代码-捕获在循环中丢失数据包,c,networking,packet-capture,winpcap,C,Networking,Packet Capture,Winpcap,我有一个用pcap_next_ex捕获数据包的循环,在每个iteraction中,我根据数据包的处理过程执行许多函数调用。这个东西可以通过循环中的Sleep()调用来模拟。然后我在pcap\u next\u ex()循环中调用Sleep会发生什么 pcap_pkthdr*头=NULL; UCHAR*content=NULL; pcap=pcap_open(adapterName.c_str(),65536,pcap_OPENFLAG_PROMISCUOUS,1000,NULL,NULL); //

我有一个用pcap_next_ex捕获数据包的循环,在每个iteraction中,我根据数据包的处理过程执行许多函数调用。这个东西可以通过循环中的Sleep()调用来模拟。然后我在pcap\u next\u ex()循环中调用Sleep会发生什么

pcap_pkthdr*头=NULL;
UCHAR*content=NULL;
pcap=pcap_open(adapterName.c_str(),65536,pcap_OPENFLAG_PROMISCUOUS,1000,NULL,NULL);
//是否设置为非块模式?
而(INT res=pcap\u next\u ex(pcap和头、const\u cast和content))>=0)
{
如果(res!=FALSE)
{
如果(内容)
{ 
//在这里,我将使用一个Sleep()调用来模拟这些操作
睡眠(200);
}
}
}
我见过使用pcap_next_ex并将数据包保存在一个向量中以便稍后使用另一个线程处理它们的代码,这种方法显著地减少了处理时间,但并不能让我信服很多。我要用这个方法吗

我想使用其他winpcap函数,在“非阻塞”模式下捕获数据包,并为每个数据包调用一个事件。。。使用winpcap避免数据包丢失的最佳方法是什么


任何帮助都将不胜感激。注意。

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

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


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

谢谢您的回答,我想知道您对“pcap\u循环”或“pcap\u调度”有何看法。他们能解决这个问题吗?。否则,正如您所说,我必须更频繁地调用“pcap\u next\u ex”或创建其他线程来处理数据包。至于WinPcap的源代码,传递给
pcap\u loop
(或
pcap\u dispatch
)的回调在调用
pcap\u loop
的同一线程中调用,这意味着您仍然需要一个专用线程来执行
pcap\u循环
,以便它能够尽快返回到读取环形缓冲区的工作中。我也遇到了同样的问题。我没有立即处理数据包,而是在队列中推送数据包,在另一个线程中处理数据包。
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);
        }
    }
}