- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我使用 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 ( ð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 字段似乎正确地反射(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/
来自 here 的代码片段: void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pk
在不复制此处所有源代码的情况下,我从 pcap_dispatch 调用了一个 pcap_callback 函数。 caplen 似乎显示了正确的长度(因为它始终是某物)但 len 始终等于 0。是否不
我使用 1.1.1 版本的 libpcap 作为静态库 (libpcap.a) 构建。当我尝试在 RHEL 6 64 位(可执行模块本身构建为 32 位 ELF 镜像)上执行以下代码块时,出现段错误:
我们在 linux 上使用 libpcap 嗅探数据包我们在每个数据包上获得的 header 如下所示: struct pcap_pkthdr { struct timeval ts;
我是一名优秀的程序员,十分优秀!