实时捕捉上的Pcap幻数

时间:2015-11-21 21:16:29

标签: c header-files pcap libpcap

是否可以在实时捕获中捕获正确的pcap标头,或者只将其放入文件中?所有文档都与文件有关......

我设法使用Linux中的libpcap轻松地从.pcap文件中提取神奇数字,使用带有Java acc的Windows中的C和Jnetpcap。至[1] [2]。 但是,当通过实时捕获(通过printf或debug)浏览头结构时,字段值似乎搞砸了。例如,snaplen值在时区字段中结束,其他值没有意义。

我正在使用

int pcap_loop(pcap_t *p, int cnt, pcap_handler my_callback, u_char *user) 

void my_callback (u_char *args, const struct pcap_file_header *header,   const u_char *packet)

Pcap.h:

struct pcap_file_header { bpf_u_int32 magic; u_short version_major; u_short version_minor; bpf_int32 thiszone; /* gmt to local correction */ bpf_u_int32 sigfigs; /* accuracy of timestamps */ bpf_u_int32 snaplen; /* max length saved portion of each pkt */ bpf_u_int32 linktype; /* data link type (LINKTYPE_*) */ };

[1] http://www.tcpdump.org/pcap/pcap.html [2] http://www.tcpdump.org/manpages/pcap-savefile.5.txt

1 个答案:

答案 0 :(得分:1)

Savefiles有一个文件头,后面是数据包记录,每个记录都有一个数据包标题。文件头包含幻数和其他几个字段。

实时捕获具有文件头,并且永远不会有文件头,因此它们没有幻数或文件头中的任何其他字段。

如果您想知道pcap_t的快照长度,请致电pcap_snapshot()。如果您正在读取保存文件,它将返回libpcap从文件头读取的快照长度。如果您有实时捕获,它将返回pcap_open_live()pcap_set_snaplen()来电中指定的快照长度,或者如果使用pcap_create()pcap_activate()而未使用pcap_set_snaplen() } call,使用的默认快照长度。

libpcap不返回时区值;它没有在大多数捕获文件中设置。

void my_callback (u_char *args, const struct pcap_file_header *header,
                  const u_char *packet)

pcap_loop()手册页说:

   typedef void (*pcap_handler)(u_char *user, const struct pcap_pkthdr *h,
                               const u_char *bytes);

因此,回调的第二个参数应为const struct pcap_pkthdr * NOT const struct pcap_file_header *pcap_loop()将返回一个数据包,一个文件头;正如我所说,实时捕获不会拥有文件头。