实时捕获中的 Pcap 幻数
Pcap magic number on live capture
是否可以在实时捕捉中捕捉到正确的 pcap header 还是仅将其放入文件中?所有文档都与文件有关...
我已经成功地使用 Linux 中的 libpcap 和 C 以及 windows 中的 Jnetpcap 和 Java acc 轻松地从 .pcap 文件中提取幻数。到 [1][2]。
但是,在实时捕获(通过 printf 或调试)时通过 header 结构时,字段值似乎搞砸了。例如,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
存档文件有一个文件头,后面是数据包记录,每个数据包记录都有一个数据包头。文件头包含一个幻数和其他几个字段。
实时捕获没有有文件头,永远不会有文件头,所以它们没有幻数或文件头中的任何其他字段.
如果您想知道 pcap_t
的快照长度,请调用 pcap_snapshot()
。如果您正在读取一个保存文件,它将 return libpcap 从文件头读取的快照长度。如果您有实时捕获,它将 return 在 pcap_open_live()
或 pcap_set_snaplen()
调用中指定的快照长度,或者,如果 pcap_create()
和 pcap_activate()
没有使用pcap_set_snaplen()
调用,使用的默认快照长度。
时区值不是由 libpcap return编辑的;大多数捕获文件中都没有设置它。
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 *
、而不是 const struct pcap_file_header *
。 pcap_loop()
将return一个数据包,不是一个文件头;正如我所说,实时捕获没有有文件头。
是否可以在实时捕捉中捕捉到正确的 pcap header 还是仅将其放入文件中?所有文档都与文件有关...
我已经成功地使用 Linux 中的 libpcap 和 C 以及 windows 中的 Jnetpcap 和 Java acc 轻松地从 .pcap 文件中提取幻数。到 [1][2]。 但是,在实时捕获(通过 printf 或调试)时通过 header 结构时,字段值似乎搞砸了。例如,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
存档文件有一个文件头,后面是数据包记录,每个数据包记录都有一个数据包头。文件头包含一个幻数和其他几个字段。
实时捕获没有有文件头,永远不会有文件头,所以它们没有幻数或文件头中的任何其他字段.
如果您想知道 pcap_t
的快照长度,请调用 pcap_snapshot()
。如果您正在读取一个保存文件,它将 return libpcap 从文件头读取的快照长度。如果您有实时捕获,它将 return 在 pcap_open_live()
或 pcap_set_snaplen()
调用中指定的快照长度,或者,如果 pcap_create()
和 pcap_activate()
没有使用pcap_set_snaplen()
调用,使用的默认快照长度。
时区值不是由 libpcap return编辑的;大多数捕获文件中都没有设置它。
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 *
、而不是 const struct pcap_file_header *
。 pcap_loop()
将return一个数据包,不是一个文件头;正如我所说,实时捕获没有有文件头。