网络编程课程设计-基于winpcap技术的网络--数据包捕获过滤和分析技术内容摘要:

1000, // 读取超时时间 NULL, // 远程机器验证 errbuf // 错误缓冲池 ) ) == NULL) { fprintf(stderr,\n无法打开网络适配器。 WinPcap不支持 %s \n, dname)。 /* 释放设备列表 */ pcap_freealldevs(alldevs)。 return 1。 } printf(\n在 %s上启动监听 ...\n, ddescription)。 /* 释放设备列表 */ pcap_freealldevs(alldevs)。 /* 开始捕获 */ pcap_loop(adhandle, 0, packet_handler, NULL)。 return 0。 } /* 每次捕获到数据包时, WinPcap都会自动调用这个回调函数 */ void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data) { struct tm *ltime。 char timestr[16]。 time_t local_tv_sec。 /* 将时间戳转换成可识别的格式 */ local_tv_sec = header。 ltime=localtime(amp。 local_tv_sec)。 strftime( timestr, sizeof timestr, %H:%M:%S, ltime)。 // 打印接收到的数据 printf(%s,%.6d len:%d\n, timestr, header, headerlen)。 } 4. 不使用事件处理器进行抓包 Pacp_next_ex()函数是基于回调技术来捕获数据的,当数据到达时,系统会自动调用指定的回调函数,处理捕 获的数据。 但使用回调方式编写的程序可读性不够好,不理解这种编程思想的人很难解程序的运行轨迹。 代码: // : 定义控制台应用程序的入口点。 // include include include include int _tmain(int argc, _TCHAR* argv[]) { pcap_if_t *alldevs。 // 获取的设备列表 pcap_if_t *d。 // 用于遍历设备列表 int inum。 // 用户选择的用于监听的 int i=0。 pcap_t *adhandle。 // 打开设备后返回的 WinPcap会话句柄 char errbuf[PCAP_ERRBUF_SIZE]。 struct tm *ltime。 // 读取数据包的时间 char timestr[16]。 struct pcap_pkthdr *header。 // 数据包头 const u_char *pkt_data。 // 数据包内容 /* 获取本机设备列表 */ if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, amp。 alldevs, errbuf) == 1) { fprintf(stderr,Error in pcap_findalldevs: %s\n, errbuf)。 exit(1)。 } /* 打印列表 */ for(d=alldevs。 d。 d=dnext) { printf(%d. %s, ++i, dname)。 if (ddescription) printf( (%s)\n, ddescription)。 else printf( (No description available)\n)。 } if(i==0) { printf(\nNo interfaces found! Make sure WinPcap is installed.\n)。 return 1。 } printf(Enter the interface number (1%d):,i)。 scanf(%d, amp。 inum)。 if(inum 1 || inum i) { printf(\nInterface number out of range.\n)。 /* 释放设备列表 */ pcap_freealldevs(alldevs)。 return 1。 } /* 跳转到已选中的适配器 */ for(d=alldevs, i=0。 i inum1。 d=dnext, i++)。 /* 打开设备 */ if ( (adhandle= pcap_open(dname, // 设备名 65536, // 要捕捉的数据包的部分 // 65535保证能捕获到不同数据链路层上的每个数据包的全部内容 PCAP_OPENFLAG_PROMISCUOUS, // 混杂模式 1000, // 读取超时时间 NULL, // 远程机器验证 errbuf // 错误缓冲池 ) ) == NULL) { fprintf(stderr,\nUnable to open the adapter. %s is not supported by WinPcap\n, dname)。 /* 释放设列表 */ pcap_freealldevs(alldevs)。 return 1。 } printf(\nlistening on %s...\n, ddescription)。 /* 释放设备列表 */ pcap_freealldevs(alldevs)。 /* 获取数据包 */ int res。 while((res = pcap_next_ex( adhandle, amp。 header, amp。 pkt_data)) = 0){ if(res == 0) /* 超时时间到 */ continue。 /* 将时间戳转换成可识别的格式 */ time_t local_tv_sec = header。 ltime=localtime(amp。 local_tv_sec)。 strftime( timestr, sizeof timestr, %H:%M:%S, ltime)。 printf(%s,%.6d len:%。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。