pcap_dispatch 子例程

用途

收集和处理包。

pcap 库 (libpcap.a)

语法

#include <pcap.h>

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

描述

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

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

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

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

参数

描述
回调 (callback) 指向用户提供的例程,将对读取的每个包调用该例程。 用户负责提供有效指针,如果提供了无效指针,那么会发生不可预测的结果。
注: 还可以将 pcap_dump 子例程指定为 callback 参数。 如果这样做,应该首先调用 pcap_dump_open 子例程。 从 pcap_dump_open 子例程返回的 pcap_dumper_t 结构的指针应用作 pcap_dispatch 子例程的 user 参数。 以下程序片段说明了此用法:
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 指定返回前要处理的最大包数。 cnt为-1时,会在一个缓冲区中处理所有接收到的数据包。 0 的 cnt 会处理所有信息包,直到发生错误,达到 EOF 或读超时 (当执行实时读和指定非零读超时时) 为止。
p 指向从 pcap_open_offlinepcap_open_live 子例程返回的包捕获描述符。 这将用于存储读取的包数据。
用户 指定要传递到 callback 例程的第一个自变量。

返回值

成功完成时, pcap_dispatch 子例程返回读取的包数。 如果在 savefile中达到 EOF ,那么将返回零。 如果pcap_dispatch子程序不成功,则返回-1。 在这种情况下,可以使用 pcap_geterrpcap_perror 子例程来获取错误文本。