Winpcap学习总结(三)

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(<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  
  )
它的功能是和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)

{

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

你可能感兴趣的:(pcap)