函数名称:int pcap_loop(pcap_t * p,int cnt, pcap_handler callback, uchar * user);

函数功能:捕获数据包,不会响应pcap_open_live()函数设置的超时时间

参数说明:p 是由pcap_open_live()返回的所打的网卡的指针;cnt用于设置所捕获数据包的个数;pcap_handler 是与void packet_handler()使用的一个参数,即回调函数的名称;user值一般为NULL

pcap_loop原型是pcap_loop(pcap_t *p,int cnt,pcap_handler callback,u_char *user)

其中第一个参数是winpcap的句柄,第二个是指定捕获的数据包个数,如果为-1则无限循环捕获。第四个参数user是留给用户使用的。第三个是回调函数其原型如下:

pcap_callback(u_char* argument,const struct pcap_pkthdr* packet_header,const u_char* packet_content)

其中参数packet_content表示的捕获到的数据包的内容参数argument是从函数pcap_loop()传递过来的。

注意:这里的参数就是指 pcap_loop中的 *user 参数参数

pcap_pkthdr 表示捕获到的数据包基本信息,包括时间,长度等信息.

另外:回调函数必须是全局函数或静态函数,其参数默认,

比如pcap_loop()可以写成pcap_loop(pcap_handle,10,pcap_callback,NULL)不能往里面传递实参.

-----------------------------------------------------------------------------------------------------------------

pcap_loop和callback之间参数存在联系:pcap_loop的最后一个参数user是留给用户使用的,当callback被调用的时候这个值会传递给callback的第一个参数(也叫user),callback的最后一个参数p指向一块内存空间,这个空间中存放的就是pcap_loop抓到的数据包。callback的第二个参数是一个结构体指针,该结构体定义如下:

struct pcap_pkthdr

{struct timeval ts; /* 时间戳 */

bpf_u_int32 caplen; /* 已捕获部分的长度 */

bpf_u_int32 len; /* 该包的脱机长度 */

这个结构体是由pcap_loop自己填充的,用来取得一些关于数据包的信息所以,在callback函数当中只有第一个user指针是可以留给用户使用的,如果你想给callback传递自己参数,那就只能通过pcap_loop的最后一个参数user来实现了

下面开始正式讲解如何使用lib pcap : 首先要使用lib pcap ,我们必须包含 pcap .h头文件,可以在/usr/local/include/ pcap / pcap .h找到,其中包含了每个类型定义的详细说明。 1.获取网络接口 首先我们需要获取监听的网络接口: 我们可以手动指定或让lib pcap 自动选择,先介绍如何让lib pcap 自动选择:char * pcap _lookupdev(char * errbuf)上面这个 函数 返回第一个合适的网络接口的字符串指针,如果出错,则errbuf存放出错信息字符串,e. 函数 原型 #include < pcap / pcap .h> typedef void (* pcap _handler)(u_char *user, const struct pcap _pkthdr *h, const u_char *bytes); int pcap _l oop ( pcap _t *p, int cnt, pcap _hand 函数 名称:int pcap _l oop ( pcap _t * p,int cnt, pcap _handler callback, uchar * user); 函数 功能:捕获数据包,不会响应 pcap _open_live() 函数 设置的超时时间  参数说明:p 是由 pcap _open_live()返回的所打的网卡的指针;cnt用于设置所捕获数据包的个数; pcap _handler 是与void packet void packet_handler(u_char *param, const struct pcap _pkthdr *header, const u_char *pkt_data); int main() pcap _if_t *alldevs; pcap _if_t *d; int inum; int i=0; pcap _t * 首先,该文章不限定OS不单针对Win pcap 或者lib pcap ,对于Win pcap 的特殊扩展使用了PS标示。        我以前使用过Win pcap ,但并没有对 pcap 开发进行过深入解析。希望这篇文章可以深入浅出的讲清楚这个问题。 Pcap 是什么?它是个监视器,或者发生器,它可以监视,也可以发生,但它不能拦截。它可以在网络上增加一些消息,但不能阻止已经存在的消息。 获取设备列表 <br />对于最常用的 pcap _l oop :<br /> pcap _l oop 原型是 pcap _l oop ( pcap _t *p,int cnt, pcap _handler callback,u_char *user)<br />其中第一个参数是win pcap 的句柄,第二个是指定捕获的数据包个数,如果为-1则无限循环捕获。第四个参数user是留给用户使用的。<br />第三个是回调 函数 其原型如下:<br /> pcap _callback(u_char* argument,const struct pcap _pkthdr 按照上面的描述就会有个问题,如果抓取的网络包不是连续的,就会是的 pcap _l oop 进入阻塞模式,如果这个时候有网络数据包过来,触发处理包的回调 函数 会有约一分钟的延时,对于实时系统或者类似Wireshark、Tcpdump等工具那就能立即反应的系统来说很不实用,因此上述方式并不实用与这种场景。因此,如果没有数据包到达, pcap _l oop 函数 就会一直等待。在默认情况下, pcap _l oop 函数 的超时时间是1秒,也就是说,如果1秒内没有数据包到达, pcap _l oop 函数 就会返回,然后再次等待。 函数 之前是不可用的。