C++使用winpcap生成wireshark可解析文件

#define HAVE_REMOTE
#include "pcap.h"

 int test()
 {
	 pcap_if_t* alldevs;
	 pcap_if_t* d;
	 pcap_t* adhandle;
	 char errbuf[PCAP_ERRBUF_SIZE];
	 int inum;
	 int i = 0;
	 u_int netmask;
	 char packet_filter[] = "ip and tcp";
	 struct bpf_program fcode;
	 int res;
	 struct pcap_pkthdr* header;
	 struct tm* ltime;
	 const u_char* pkt_data;
	 time_t local_tv_sec;
	 char timestr[16];
	 ip_header* ih;
	 u_char* packet;

	 // 获得设备列表 pcap_findalldevs_ex()
	 if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1) {
		 fprintf(stderr, "Error in pcap_findalldevs: %s\n", errbuf);
		 exit(1);
	 }

	 for (d = alldevs; d; d = d->next) {
		 WriteLog(FormatString("%d. %s", ++i, d->name).c_str());
		 if (d->description) {
			 WriteLog(FormatString("(%s)\n", d->description).c_str());
		 }
		 else {
			 printf("No description available\n");
		 }
	 }

	 if (0 == i) {
		 printf("\nNo interface found!Make sure WinPcap is installed\n");
		 return -1;
	 }

	//网卡,这里测试是我本机的,正常是需要选择的
	 for (d = alldevs, i = 1; i < 2; d = d->next, i++);
	 // 跳转到该设备,打开适配器

	 // 设备名,要捕捉的数据包的部分(65536保证能捕获到不同数据链路层上的每个数据包的全部内容),混杂模式,读取超时时间,错误缓冲池
	 if ((adhandle = pcap_open_live(d->name, 65536, 1, 1000, errbuf)) == NULL) {
		 fprintf(stderr, "\nUnable to open the adapter.%s is not supported by WinPcap\n", errbuf);
		 pcap_freealldevs(alldevs);
		 return -1;
	 }
	 // 检查数据链路层(只考虑了以太网)
	 if (pcap_datalink(adhandle) != DLT_EN10MB) {
		 fprintf(stderr, "\nThis program works only on Ethernet networks.\n");
		 pcap_freealldevs(alldevs);
		 return -1;
	 }

	 if (d->addresses != NULL) {
		 // 获得接口的第一个地址的掩码
		 netmask = ((struct sockaddr_in*)(d->addresses->netmask))->sin_addr.S_un.S_addr;
	 }
	 else {
		 netmask = 0xffffff;
	 }

	 // 编译过滤器
	 if (pcap_compile(adhandle, &fcode, packet_filter, 1, netmask) < 0) {
		 fprintf(stderr, "\nUnable to compile the packet filter.Check the syntax\n");
		 pcap_freealldevs(alldevs);
		 return -1;
	 }

	 // 设置过滤器
	 if (pcap_setfilter(adhandle, &fcode) < 0) {
		 fprintf(stderr, "\nError setting the filter.\n");
		 pcap_freealldevs(alldevs);
		 return -1;
	 }
	 WriteLog(FormatString("\nlistenting on %s...\n", d->description).c_str());
	 pcap_dumper_t* dumpfp;
	 //输出文件 traffic.data
	dumpfp = pcap_dump_open(adhandle, "traffic.data");
	if (dumpfp == NULL) {
		printf("Error on opening output file\n");
		exit(-1);
	}
	 while ((res = pcap_next_ex(adhandle, &header, &pkt_data)) >= 0) {
		 // 请求超时
		 if (0 == res) {
			 continue;
		 }
		 pcap_dump((u_char*)dumpfp, header, pkt_data);
	 }
	 
	 pcap_dump_close(dumpfp);
	 pcap_freealldevs(alldevs);
	 
	 return 0;

 }


  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基本信息 作者: 王晓卉 李亚伟 出版社:清华大学出版社 ISBN:9787302388715 上架时间:2015-3-16 出版日期:2015 年3月 开本:16开 页码:404 版次:1-1 所属分类:计算机 > 计算机网络 > 综合 编辑推荐   通过80个实例,详细讲解了Wireshark数据包分析实施的8大类技巧 基于Wireshark抓取的数据包,层层剥茧地剖析了12种常见网络协议的构成 内容简介 书籍 计算机书籍 《Wireshark数据包分析实战详解》由浅入深,全面系统地介绍了Wireshark数据抓包和数据包分析。本书提供了大量实例,供读者实战演练Wireshark的各项功能。同时,对抓取的数据包按照协议层次,逐层讲解各个协议在数据包中的体现。这样,读者就可以掌握数据包抓取到信息获取的每个环节。 《Wireshark数据包分析实战详解》共分3篇。第1篇介绍Wireshark的各项功能,包括基础知识、Wireshark的定制、捕获过滤器和显示过滤器的使用、数据包的着色、导出和重组等;第2篇介绍基于Wireshark对TCP/IP协议族中常用协议的详细分析,如ARP、IP、UDP、TCP、HTTP、HTTPS和FTP等;第3篇介绍借助Wireshark分析操作系统启动过程中的网络通信情况。 《Wireshark数据包分析实战详解》涉及面广,内容包括工具使用、网络协议和应用。本书适合各类读者群体,如想全面学习Wireshark的初学者、网络管理员、渗透测试人员及网络安全专家等。对于网络数据分析人士,本书更是一本不可多得的案头必备参考书。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值