gpt4 book ai didi

c++ - pcap_next 调用填充 pcap_pkthdr,其中 len 等于零

转载 作者:太空宇宙 更新时间:2023-11-04 03:57:33 30 4
gpt4 key购买 nike

我使用 1.1.1 版本的 libpcap 作为静态库 (libpcap.a) 构建。当我尝试在 RHEL 6 64 位(可执行模块本身构建为 32 位 ELF 镜像)上执行以下代码块时,出现段错误:

const unsigned char* packet;
pcap_pkthdr pcap_header = {0};
unsigned short ether_type = 0;

while ( ether_type != ntohs( 0x800 ) )
{
packet = pcap_next ( m_pcap_handle, &pcap_header );
if (packet != NULL)
{
memcpy ( &ether_type, &( packet[ 12 ] ), 2 );
}
else
{
/*Sleep call goes here*/
}
}

if ( raw_buff ->data_len >= pcap_header.caplen )
{
memcpy ( raw_buff->data, &(packet[14]), pcap_header.len -14 );
raw_buff->data_len = pcap_header.len -14;
raw_buff->timestamp = pcap_header.ts;
}

一些调查显示 pcap_header.len 字段在 pcap_next 返回时等于零。事实上,caplen 字段似乎正确地反射(reflect)了数据包的大小。如果我尝试从 packet 地址转储数据包内存 - 数据似乎是有效的。由于 len 字段等于零,我知道它是无效的。它应该至少有 caplen 级别。这是一个错误吗?我应该采取什么步骤来解决这个问题?

GDB 将 pcap_header 内容显示为:

(gdb) p pcap_header

$1 = {ts = {tv_sec = 5242946, tv_usec = 1361456997}, caplen = 66, len = 0}

也许我可以应用一些解决方法?我不想升级 libpcap 版本。

最佳答案

2.6.27 内核之前的内核不支持在 64 位内核上使用 libpcap 1.0 或更高版本运行 32 位二进制文​​件。

libpcap 1.0 及更高版本在 Linux 内核上使用“内存映射”捕获机制,该机制的第一个版本不能确保内核和使用“内存映射”的代码之间共享的数据结构"捕获机制在 32 位和 64 位模式下以相同的方式布置在内存中。

2.6.27 内核之前的 2.6 内核只有该机制的第一个版本。 2.6.27 内核具有该机制的第二个版本,它确实确保数据结构在 32 位和 64 位模式下以相同的方式布置在内存中,因此 32 位用户模式代码在 32 位和 64 位内核上的工作方式相同。

关于c++ - pcap_next 调用填充 pcap_pkthdr,其中 len 等于零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15007595/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com