Networking Pcap丢弃数据包 //打开以太网适配器 handle=pcap_open_live(“eth0”,65356,1,0,errbuf); //确保它正确打开 if(handle==NULL) { printf(“无法打开设备:%s\n”,errbuf); 出口(1); } //编译过滤器 if(pcap_编译(句柄和bpf,“udp”,0,pcap_网络掩码_未知)) { printf(“pcap_compile():%s\n”,pcap_geterr(handle)); 出口(1); } //设置过滤器 如果(pcap_设置过滤器(句柄和bpf)

Networking Pcap丢弃数据包 //打开以太网适配器 handle=pcap_open_live(“eth0”,65356,1,0,errbuf); //确保它正确打开 if(handle==NULL) { printf(“无法打开设备:%s\n”,errbuf); 出口(1); } //编译过滤器 if(pcap_编译(句柄和bpf,“udp”,0,pcap_网络掩码_未知)) { printf(“pcap_compile():%s\n”,pcap_geterr(handle)); 出口(1); } //设置过滤器 如果(pcap_设置过滤器(句柄和bpf),networking,udp,packet,pcap,libpcap,Networking,Udp,Packet,Pcap,Libpcap,process_packet函数去掉报头并对数据进行一些处理。然而,当它花费的时间太长时,我认为它是在丢弃数据包 如何使用pcap侦听udp数据包,并能够在不丢失数据包的情况下对数据进行某些处理 嗯,您没有无限的存储空间,因此,如果您继续以低于数据包到达速度的速度运行,您将在某个时候丢失数据 当然,如果你有相当大的存储空间,并且平均来说,你不会落后(例如,你可能会在突发事件中跑得很慢,但在安静的时间里你可以赶上),那么问题就会得到缓解 一些网络嗅探器这样做,只是将原始数据写入一个文件供以后分析

process_packet函数去掉报头并对数据进行一些处理。然而,当它花费的时间太长时,我认为它是在丢弃数据包


如何使用pcap侦听udp数据包,并能够在不丢失数据包的情况下对数据进行某些处理

嗯,您没有无限的存储空间,因此,如果您继续以低于数据包到达速度的速度运行,您将在某个时候丢失数据

当然,如果你有相当大的存储空间,并且平均来说,你不会落后(例如,你可能会在突发事件中跑得很慢,但在安静的时间里你可以赶上),那么问题就会得到缓解

一些网络嗅探器这样做,只是将原始数据写入一个文件供以后分析

这是一个技巧,你也可以使用,但不一定与文件。可以使用大规模内存结构,如循环缓冲区,其中一个线程(捕获线程)写入原始数据,另一个线程(分析线程)读取和解释。而且,因为每个线程只处理缓冲区的一端,所以您甚至可以在不使用锁(或使用非常短的锁)的情况下构建它

这也使得检测缓冲区是否用完并引发某种错误变得容易,而不仅仅是在应用程序级别丢失数据

当然,这一切都取决于您的“简单而快速”捕获线程是否能够跟上流量


澄清我的意思,修改
process\u packet
函数,使其只将原始数据包写入大量循环缓冲区(检测溢出并相应地采取行动)。这将使它尽可能快,避免pcap本身丢弃数据包

然后,有一个分析线程,该线程从队列中取出数据,并执行以前在
process\u packet
中完成的工作(“除去头并对数据进行一点处理”位)


另一种可能的解决方案是增大pcap内部缓冲区的大小。根据手册页:

为捕获而到达的数据包存储在缓冲区中,因此应用程序不必在数据包到达后立即读取它们

在某些平台上,可以设置缓冲区的大小;太小的大小可能意味着,如果捕获的数据包太多,并且快照长度不限制缓冲的数据量,如果缓冲区在应用程序可以从中读取数据包之前填满,数据包可能会被丢弃,而过大的大小可能会使用比防止数据包丢失所需的更多的不可分页操作系统内存

使用
pcap\u set\u buffer\u size()
设置缓冲区大小


脑海中浮现的唯一其他可能性是确保对每个数据包所做的处理尽可能优化


将处理拆分为收集和分析应该可以缓解跟不上的问题,但它仍然依赖于安静的时间来追赶。如果您的网络流量始终超出了您的分析所能处理的范围,那么您所做的就是延迟问题。优化分析可能是保证永远不会丢失数据的唯一方法。

您是否尝试过使用
pcap\u set\u buffer\u size
来扩大缓冲区?我将缓冲区增加到8mb,并使用循环缓冲区(1000数组大小)实现线程。我仍在丢弃数据包。对于具有闪存存储30-40 MiB的MIPS体系结构,缓冲区大小应该是多少,以使其不会太大?(2-4 MiB?)AMD 3950x,我正在丢失软件包。。。它大约只有12kb/s
// Open the ethernet adapter
handle = pcap_open_live("eth0", 65356, 1, 0, errbuf);

// Make sure it opens correctly
if(handle == NULL)
{
    printf("Couldn't open device : %s\n", errbuf);
    exit(1);
}

// Compile filter
if(pcap_compile(handle, &bpf, "udp", 0, PCAP_NETMASK_UNKNOWN))
{
    printf("pcap_compile(): %s\n", pcap_geterr(handle));
    exit(1);
}

// Set Filter
if(pcap_setfilter(handle, &bpf) < 0)
{
    printf("pcap_setfilter(): %s\n", pcap_geterr(handle));
    exit(1);
}

// Set signals
signal(SIGINT, bailout);
signal(SIGTERM, bailout);
signal(SIGQUIT, bailout);

// Setup callback to process the packet
pcap_loop(handle, -1, process_packet, NULL);