c - 实时捕捉上的 Pcap 魔数

标签 c header-files pcap libpcap

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

我已经成功地从 .pcap 文件中轻松提取魔数(Magic Number),在 Linux 中使用 C 语言的 libpcap,在 Windows 中使用 Java acc 的 Jnetpcap。至[1][2]。 然而,当查看实时捕获的 header 结构时(通过 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

最佳答案

保存文件有一个文件头,后面是数据包记录,每个数据包记录都有一个数据包头。文件头包含一个魔数(Magic Number)和几个其他字段。

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

如果您想知道pcap_t的快照长度,请调用pcap_snapshot()。如果您正在读取保存文件,它将返回 libpcap 从文件头读取的快照长度。如果您有实时捕获,它将返回在 pcap_open_live()pcap_set_snaplen() 调用中指定的快照长度,或者,如果 pcap_create() > 和 pcap_activate() 在没有调用 pcap_set_snaplen() 的情况下使用,即使用的默认快照长度。

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() 将返回一个数据包,而不是文件头;正如我所说,实时捕获没有文件头。

关于c - 实时捕捉上的 Pcap 魔数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33848670/

相关文章:

fortran - 如何使用 *.h 文件编译此旧版 FORTRAN 77 代码?

c - proj.c :(. text+0x140): 对 `pcap_open_offline' 的 undefined reference

c - 使用 pcap 库检测 eap 数据包(802.1X 身份验证)

Python 到 C 转换器/解释器

iphone - Xcode - 根据目标导入具有相同名称的不同头文件

C++ #ifndef 对于包含文件,为什么头文件全部使用大写?

c++ - 用pcap抓图跟不上?

c - C程序在执行函数时崩溃

c - select() 在非阻塞 AF_PACKET 套接字上立即返回 0,忽略 timeval

c - 动态分配的堆栈和指针运算出现奇怪的内存错误