我正在使用作为静态库(libpcap.a)构建的1.1.1版libpcap 。当我尝试在 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 ( ðer_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字段似乎正确地反映了数据包的大小。如果我尝试从数据包地址转储数据包内存 - 数据似乎是有效的。由于len字段等于零,我知道它是无效的。它应该至少是卡普伦量级。它是一个错误吗?我应该采取什么步骤来解决这个问题?
GDB将pcap_header内容显示为:
(gdb) p pcap_header
$1 = {ts = {tv_sec = 5242946,tv_usec = 1361456997},caplen = 66,len = 0}
也许我可以应用一些解决方法?我不想升级libpcap版本。