gpt4 book ai didi

c - 代码中的一些错误 - libpcap

转载 作者:太空宇宙 更新时间:2023-11-04 01:12:27 25 4
gpt4 key购买 nike

我正在尝试用 C 解析一个 pcap 文件。我不想使用 libpcap。但出于某种原因,我无法做到。你知道我该怎么做吗?这是我的尝试:

fseek(f,24,0);
while(count<20)//reading 20 packets
{
fread(header,sizeof(struct pcap_pkthdr),1,f);
//after this I'm printing values header fields
fseek(f,ntohl(header->caplen),1);
count++;
}

输出与 libpcap 不同。

最佳答案

struct pcap_pkthdr 不是定义 pcap 文件中数据包 header 格式的结构;它是定义数据包 header 格式的结构,提供给使用 libpcap 或 WinPcap 的程序。

在 pcap 文件中定义包头格式的结构不是在任何 pcap 包含文件中,因为 libpcap/WinPcap 提供了读取这些头并根据需要将它们转换为 pcap_pkthdr header 。与 struct pcap_pkthdr 不同,pcap 文件中包头中的时间戳总是有一个 32 位“秒”字段和一个 32 位“微秒”字段,即使在 time_tstruct timeval 中的 tv_sec 值是 64 位。

即结构定义为

struct pcap_timeval {
bpf_int32 tv_sec; /* seconds */
bpf_int32 tv_usec; /* microseconds */
};


struct pcap_sf_pkthdr {
struct pcap_timeval ts; /* time stamp */
bpf_u_int32 caplen; /* length of portion present */
bpf_u_int32 len; /* length this packet (off wire) */
};

其中 struct pcap_sf_pkthdr 是文件中的结构。

另请注意,如果您从文件中读取struct pcap_sf_pkthdr,则必须对ts.tv_sects.tv_usec 进行字节交换code>、caplenlen 如果 文件是在字节顺序与您正在读取的机器不同的机器上写入的文件。像 ntohl() 这样简单的东西将 NOT 工作 - 例如,如果您的文件是在与您正在读取它的机器相同的机器上编写的,没有字节-交换是必要的。

唯一的方法是读取文件头,而不是使用fseek() 跳过它。如果文件头中的“魔数(Magic Number)”的值为0xa1b2c3d4,则不需要进行任何字节交换;如果它的值为 0xd4c3b2a1,您将需要对文件头和 struct pcap_sf_pkthdr 中的值进行字节交换。请注意,ntohl()htonl()NOT 字节交换,如果您在大端计算机(如 PowerPC)上运行/Power Architecture 机器或 MIPS 机器或 IBM 大型机或......

另请注意,并非所有捕获文件都是 pcap 文件;如果它们是 pcap-NG 文件,则必须以完全不同的方式读取它们。 Libpcap 1.1 及更高版本知道如何读取 pcap-NG 文件(libpcap/WinPcap API 不够强大,无法处理所有 pcap-NG 文件,但它可以,例如,处理 pcap-NG 文件只有一个部分并且只有来自一个网络适配器的数据包,libpcap 1.1 及更高版本可以读取这些数据包)。正如 unwind 所建议的那样,我建议您使用 libpcap/WinPcap 来读取捕获文件,而不是编写自己的代码来执行此操作。

关于c - 代码中的一些错误 - libpcap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9276205/

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