gpt4 book ai didi

c++ - libpcap 错误 : truncated dump file; bogus savefile header

转载 作者:行者123 更新时间:2023-11-30 02:45:39 27 4
gpt4 key购买 nike

我正在使用一个标准和简单的程序来读取一个 open_file 的所有数据包。open_file 意味着我正在使用 tcpdump 来捕获 eth0 接口(interface)上的所有流量并将其全部写入文件。运行我的程序时,出现以下错误代码:

"truncated dump file; tried to read 16 header bytes, only got 11
sleeping
bogus savefile header
sleeping
bogus savefile header
..
..
..
(and so on)"

这是程序的重要部分:

handle = pcap_fopen_offline(pFile, errbuf);
while (true) {
if (pcap_loop(handle,num_packets , got_packet, NULL)== -1){
std::cout << pcap_geterr(handle)<< std::endl;
}
sleep(1);
std::cout << "sleeping" << std::endl;

}

pcap_close(handle);

所以,我使用 sleep(1) 是为了让数据在再次迭代之前保持流动。

有人知道我为什么会收到此错误吗?看起来我发生在我的程序到达文件末尾并开始读取 tcpdump 未完成写入的数据包时。发生此错误后,pcap_loop 无法从打开的文件中读取任何其他数据包。

最佳答案

is anybody has a clue why do I get this error?

因为 tcpdump 使用 libpcap 写入文件,而 libpcap 使用诸如 fwrite() 之类的“标准 I/O”例程来写入,而这些例程会将数据缓冲在内存中,并且只将其写入到归档时间

  1. 缓冲区填满;
  2. 文件已关闭;
  3. 应用程序执行明确的“刷新”操作;

默认情况下,tcpdump 不会在每个数据包之后执行“刷新”操作,因此,在任何给定点,数据包的一部分可能会写入文件,而其中一部分可能仍在内存中。

即,您正在做的事情不能保证有效,也不应该保证有效。

Wireshark 做类似的事情,但是 Wireshark 运行的用于捕获数据包 (dumpcap) 的程序有一个到 Wireshark 的管道,并且对于它写入文件的每组数据包,它执行一个“在数据包组之后刷新”并向 Wireshark 发送一条消息说“这里还有 N 个数据包”,并且 Wireshark 在进行捕获时不会尝试读取到文件末尾,它只是尝试读取它正在捕获的数据包数量被告知在那里。

Tcpdump 没有像 dumpcap 的机制(dumpcap 的机制是 Wireshark/TShark 和 dumpcap 之间的私有(private)协议(protocol),不能保证从 Wireshark 版本到 Wireshark 版本保持不变,所以你不能安全地使用 dumpcap ).

较新版本的 tcpdump 确实 有一个“-U”标志,这会导致在每组数据包写入文件后进行“刷新”。但是,如果一组数据包足够大,这仍可能导致对文件进行多次写入,因此可能会有一个时间间隔,在此期间文件包含数据包的一部分。

简短版本:您尝试做的事情不会起作用,而且可能无法起作用。你到底想做什么? (不是“从 tcpdump 正在写入的文件中读取”——您可能是出于其他原因这样做;可能有更好的方法来完成它。)

关于c++ - libpcap 错误 : truncated dump file; bogus savefile header,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24244761/

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