int pcap_loop | ( | pcap_t * | p, | |
int | cnt, | |||
pcap_handler | callback, | |||
u_char * | user | |||
) |
跟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(<ime, &local_tv_sec);//把long类型转换为struct tm类型
strftime(timestr, sizeof timestr, "%H:%M:%S", <ime);//把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 | |||
) |
第一个参数是句柄,后两个参数是和上面回调函数一样的意思
返回值: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)
{
/*对数据进行处理,跟在回调函数中是一样的*/
}