1.pcap_dump()和pcap_live_dump()
void pcap_dump (u_char *user, const struct pcap_pkthdr *h, const u_char *sp)
将数据包保存到磁盘
int pcap_live_dump (pcap_t *p, char *filename, int maxsize, int maxpacks)
将捕获保存到文件
pcap_live_dump() 和 pcap_dump()的区别,除了可以设置限制之外,就是运行结果。pcap_live_dump() 利用了 WinPcap NPF 驱动自带的功能, (详情请参见 NPF 驱动核心手册) ,在内核级来写堆文件,并将上下文交换的数量和内存拷贝的数量最小化。显然,这个特性目前并不能应用于其它操作系统,因为 pcap_live_dump() 是 WinPcap 的特性之一,并且只运行于 Win32 平台下。
2.pcap_dispatch()和 或 pcap_loop()
当适配器被打开,捕获工作就可以用 pcap_dispatch() 或 pcap_loop()进行。 这两个函数非常的相似,区别就是 pcap_ dispatch() 当超时时间到了(timeout expires)就返回 (尽管不能保证) ,而 pcap_loop() 不会因此而返回,只有当 cnt 数据包被捕获,所以, pcap_loop()会在一小段时间内,阻塞网络的利用。 pcap_loop()对于我们这个简单的范例来说,可以满足需求,不过, pcap_dispatch() 函数一般用于比较复杂的程序中。这两个函数都有一个 回调 参数, packet_handler 指向一个可以接收数据包的函数。 这个函数会在收到每个新的数据包并收到一个通用状态时被 libpcap 所调用 ( 与函数 pcap_loop() 和pcap_dispatch() 中的 user 参数相似),数据包的首部一般有一些诸如时间戳,数据包长度的信息,还有包含了协议首部的实际数据。 注意:冗余校验码 CRC 不再支持,因为帧到达适配器,并经过校验确认以后,适配器就会将 CRC 删除,与此同时,大部分适配器会直接丢弃 CRC 错误的数据包,所以, WinPcap 没法捕获到它们。请注意,使用 pcap_loop() 函数可能会遇到障碍,主要因为它直接由数据包捕获驱动所调用。因
此,用户程序是不能直接控制它的。另一个实现方法(也是提高可读性的方法),是使用pcap_next_ex() 函数。
void pcap_breakloop (pcap_t *)
设置一个标志位,这个标志位会强制 pcap_dispatch() 或 pcap_loop() 返回,而不是继续循环。