Winpcap学习总结(三)

本文介绍了Winpcap中的pcap_loop和pcap_next_ex函数,详细阐述了它们与pcap_dispatch的区别,以及如何使用这两个函数来捕获和处理网络数据包。通过示例代码展示了如何定义回调函数pcap_handler和如何处理每个数据包。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1:

int pcap_loop( pcap_t *  p,
   int  cnt,
   pcap_handler  callback,
   u_char *  user 
 )
功能:这个函数十分有用,经常用这个函数来访问文件或网卡的数据。它的实现可以看做是一个循环,即循环访问所有的数据包直到cnt结束,或出现错误;

跟pcap_dispatch()函数几乎一样,唯一不一样的地方是loop忽视pcap_open()里设置的读取超时时间,而dispatch不忽视,即时间一到,返回值

参数:p就是打开文件后保存的类型,是由pcap_open()返回的值;cnt代表的是这个循环要读cnt个数据包,直至把cnt读到0,若cnt初始值为0,则一直循环的读下去

callback,是个函数,称它为回调函数,一般是pcap_loop()访问到某一个包,但对包具体的操作都在callback()函数里;user是给用户自己分配的,若不分配则为NULL

返回值:0代表cnt个packet已访问完,-1代表出现错误,-2代表循环终止

callback()回调函数:

void pcap_handler (u_char *user, const struct pcap_pkthdr *pkt_header, const u_char *pkt_data)

它是在pcap_loop()中对每个packet进行具体的操作的,第一个参数user是pcap_loop()中的第四个参数;pcap_pkthdr存储着数据的一些基本信息,比如,时间,长度等,pkt_header是指向它的指针;pkt_data是指向每个访问的数据包的内存的地址;要想知道数据包里面到底有什么,通常是对pkt_data进行操作。

pcap_loop(handle, 0, packet_handler_3, NULL);//从句柄中获得一组数据包

void packet_handler_3(u_char *param, const struct pcap_pkthdr *header, const u_char*pkt_data)//打印出每一个数据包的时间和长度
{
struct tm ltime;
char timestr[16];
time_t local_tv_sec;//typedef long time_t


/*
* unused variables
*/
(VOID)(param);
(VOID)(pkt_data);


/* convert the timestamp to readable format */
local_tv_sec = header->ts.tv_sec;
localtime_s(&ltime, &local_tv_sec);//把long类型转换为struct tm类型
strftime(timestr, sizeof timestr, "%H:%M:%S", &ltime);//把struct tm类型转换成字符串输出出来
printf("%s %.6d len:%d caplen:%d\n", timestr, header->ts.tv_usec, header->len, header->caplen);


}

2.

int pcap_next_ex( pcap_t *  p,
   struct pcap_pkthdr **  pkt_header,
   const u_char **  pkt_data 
 )
它的功能是和pcap_loop()是一样的,也是访问数据包,但它每次只访问一个,要想达到pcap_loop()的效果要用循环。

第一个参数是句柄,后两个参数是和上面回调函数一样的意思

返回值:1代表读取没有任何问题,0代表达到pcap_open()设置的超时时间,-1代表错误发生,-2代表读取文件时达到尾部

用法:

pcap_t *handle;

struct pcap_pkthdr *pkt_header;

const u_char *pkt_data;

while(pcap_next_ex(handle,&pkt_header ,&pkt_data)==1)

{

/*对数据进行处理,跟在回调函数中是一样的*/
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值