libpcap错误:截断的转储文件;伪造的文件头

时间:2014-06-16 13:21:13

标签: c++ libpcap

我正在使用标准的简单程序来读取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无法从打开的文件中读取任何其他数据包。

1 个答案:

答案 0 :(得分:3)

  

是否有人知道为什么我会收到此错误?

因为tcpdump使用libpcap写入文件,而libpcap使用&#34;标准I / O&#34;例如fwrite()写的例程,以及那些例程缓冲内存中的数据,只在

时将其写入文件
  1. 缓冲区填满;
  2. 文件已关闭;
  3. 应用程序显式&#34; flush&#34;操作;
  4. 默认情况下,

    和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; - 你可能因为某些其他原因而这样做;可能有更好的方法来完成它。)