pcap_loop 子例程

用途

收集和处理包。

pcap 库 (libpcap.a)

语法

#include <pcap.h>

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

描述

pcap_loop 子例程读取和处理包。 可以调用此子例程来读取和处理存储在先前保存的包捕获数据文件 (称为 savefile) 中的包。 子例程还可以读取和处理正在实时捕获的包。

此子例程类似于 pcap_dispatch 子例程,但它继续读取包,直到处理了 cnt 包,达到 EOF (在脱机读取的情况下) 或发生错误为止。 发生实时读超时时,不会返回此值。 即,对 pcap_open_live 子例程指定非零读超时,然后调用 pcap_loop 子例程允许接收和处理超时发生时到达的任何包。

请注意,第三个参数 callback的类型为 pcap_handler。 这是一个指向具有三个参数的用户提供的子例程的指针。 定义此用户提供的子例程,如下所示:

void user_routine(u_char *user, struct pcap_pkthdr *phrd, u_char *pdata)

参数 user将是传递到 pcap_dispatch 子例程的用户参数。 参数 phdr是指向 pcap_pkthdr 结构的指针,该结构在 savefile 中的每个包之前。 参数 pdata指向包数据。 这允许用户定义自己对其过滤包的处理。

参数

描述
回调 (callback) 指向用户提供的例程,将对读取的每个包调用该例程。 用户负责提供有效指针,如果提供了无效指针,那么会发生不可预测的结果。
注: 还可以将 pcap_dump 子例程指定为回调参数。 如果已完成此操作,请首先调用 pcap_dump_open 子例程。 然后使用指向从 pcap_dump_open 子例程返回的 pcap_dumper_t 结构的指针作为 pcap_dispatch 子例程的用户参数。 以下程序片段说明了此用法:
pcap_dumper_t *pd
pcap_t * p;
int rc = 0;

pd = pcap_dump_open(p, "/tmp/savefile");

rc = pcap_dispatch(p, 0 , pcap_dump, (u_char *) pd);
Cnt 指定返回前要处理的最大包数。 负值会导致 pcap_loop 子例程永远循环,或者直到达到 EOF 或发生错误。 0 的 cnt 处理所有包,直到发生错误或达到 EOF 为止。
p 指向从 pcap_open_offlinepcap_open_live 子例程返回的包捕获描述符。 这将用于存储读取的包数据。
用户 指定要传递到 callback 例程的第一个自变量。

返回值

成功完成时, pcap_loop 子例程返回 0。 如果在 savefile中已达到 EOF ,那么也会返回 0。 如果 pcap_loop 子程序不成功,则返回 -1。 在这种情况下,可以使用 pcap_geterr 子例程或 pcap_perror 子例程来获取错误文本。