函数名称: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
函数
就会返回,然后再次等待。
函数
之前是不可用的。