我正在使用标准的简单程序来读取open_file的所有数据包。 open_file意味着我正在使用tcpdump来捕获eth0接口上的所有流量并将其全部写入文件。 运行我的程序时,我收到以下错误代码:
"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无法从打开的文件中读取任何其他数据包。
答案 0 :(得分:3)
是否有人知道为什么我会收到此错误?
因为tcpdump使用libpcap写入文件,而libpcap使用&#34;标准I / O&#34;例如fwrite()
写的例程,以及那些例程缓冲内存中的数据,只在
和tcpdump不会执行&#34; flush&#34;在每个数据包之后,因此,在任何给定点,数据包的一部分可能被写入文件,而其中一部分可能仍在内存中。
即,您正在做的事情并不能保证能够正常工作,并且不应该保证能够正常工作。
Wireshark做了类似的事情,但 Wireshark运行的程序来执行数据包捕获(dumpcap)有一个Wireshark管道,并且,对于写入文件的每组数据包,它执行一个& #34;冲洗&#34;在数据包组之后,向Wireshark发送一条消息说&#34;这里有N个数据包&#34;,并且Wireshark在进行捕获时没有尝试读取到文件的末尾,它只是尝试读取它被告知的数据包的数量。
Tcpdump没有像dumpcap这样的机制(而dumpcap的机制是Wireshark / TShark和dumpcap之间的私有协议,不能保证从Wireshark发布到Wireshark保持不变发布,所以你不能安全地使用dumpcap。
较新版本的tcpdump 做有一个&#34; -U&#34;标志,导致&#34; flush&#34;在写入文件的每组数据包之后完成。但是,如果一组数据包足够大,这可能仍会导致对文件进行多次写入,因此可能存在文件包含数据包的时间间隔。
简短版本:您尝试做的事情不会起作用,可能无法发挥作用。你究竟想做什么? (不是&#34;从tcpdump写入的文件中读取&#34; - 你可能因为某些其他原因而这样做;可能有更好的方法来完成它。)