使用WinPcap编程(1) -----把网络数据包存储到一个文件中

假设 适配器描述符 为:          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);


你可能感兴趣的:(使用WinPcap编程(1) -----把网络数据包存储到一个文件中)