假设 适配器描述符 为: pcap_t * pcap_dead_handle;
PCAP的结构体指针假设: pcap_dumper_t *pcap_dumper;
结构体变量: struct pcap_pkthdr pcap_h;
讲一个结构体:
struct timeval结构体在time.h中的定义为: struct timeval { __time_t tv_sec; /* Seconds. */ __suseconds_t tv_usec; /* Microseconds. */ }; 其中,tv_sec为Epoch到创建struct timeval时的秒数,tv_usec为微秒数,即秒后面的零头。比如当前我写博文时的tv_sec为1244770435,tv_usec为442388,即当前时间距Epoch时间1244770435秒,442388微秒 struct pcap_pkthdr { struct timeval ts; ts是一个结构struct timeval,它有两个部分,第一部分是1900开始以来的秒数,第二部分是当前秒之后的毫秒数 bpf_u_int32 caplen; 表示抓到的数据长度 bpf_u_int32 len; 表示数据包的实际长度 }
函数 : pcap_t *pcap_dumper_dead (int linktype, int snaplen)
功能 : 在还没开始捕获时,创建一个pcap_t的结构体 , 那么返回一个适配器描述符 为: pcap_dead_handle
函数 : pcap_dumper_t * pcap_dump_open(pcap_t* p,const char* name)
功能 : 打开一个堆文件,第二个参数是文件的名字,第一个参数是已经打开的适配器描述符:pcap_dead_handle。
函数出错 返回NULL,否则返回一个PCAP的结构体指针 为: pcap_dumper;
函数 : void pcap_dump(u_char *, const struct pcap_pkthdr *, const u_char *);
功能 : 将数据包保存到磁盘,第一个参数即open的返回参数, 第二个是 struct pcap_pkthdr 结构体指针,第三个一般为数据报的data 段。
函数: pcap_dump_close(pcap_dumper_t *)
功能: 关闭 文件描述符。
函数: pcap_close(pcap_t * )
功能: 关闭一个适配器的描述符
疑问:
由于本身对于pcap 并不熟悉, 所以 今天再将网络数据包存储到文件的过程中, 出现我想定位到底有没有 写这个文件, 但是由于我没有添加最后的pcap_dump_close 和 pcap_close 然后看文件 始终没有写成功, 纠结了很久, 最后终于找到原因!!!坑爹啊!
附上一段代码示例:
pcap_t *pcap_dead_handle; pcap_dumper_t *pcap_dumper; if ((pcap_dead_handle = pcap_open_dead(1, 1518)) == NULL) { printf("Error opening dead pcap handle\n"); return 0; } char pathname[256] = {'\0'}; struct in_addr in; in.s_addr = p->src.address.address_un_data32[0]; sprintf(pathname, "%s/%s-%d.pcap", DIR, inet_ntoa(in), p->dp); if ((pcap_dumper = pcap_dump_open(pcap_dead_handle, pathname)) == NULL) { printf("Error opening dump pcap handle\n"); return 0; } int len; struct pcap_pkthdr pcap_h; pcap_h.ts.tv_sec = p->ts.tv_sec; pcap_h.ts.tv_usec = p->ts.tv_usec; pcap_h.caplen = GET_PKT_LEN(p); pcap_h.len = GET_PKT_LEN(p); pcap_dump(pcap_dumper, &pcap_h, GET_PKT_DATA(p)); pcap_dump_close(pcap_dumper); pcap_close(pcap_dead_handle);