网络编程工程实训_第1页
网络编程工程实训_第2页
网络编程工程实训_第3页
网络编程工程实训_第4页
网络编程工程实训_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、网络编程工程实训(一)实验名称 网络编程工程实践综合设计实验(二)实验内容(三)实验要求1、基于WinSock或WinPcap技术,使用C+编程语言,MFC或其它C+框架类库,Visual C+ 2005或后续版本作为开发工具,编程实现整个网络应用程序。软件必须能正确运行,并进行简单的测试。2、简要描述软件需求、软件设计(包括功能模块设计,类设计、界面设计,输入输出设计,代码设计等)、软件实现以及软件测试过程和结果。(四)实验步骤1、需求分析,描述软件需求。 整合第九章程序片段,将第九章的五个实验组合成一个可以运行的程序。2、软件开发,编程实现软件需求。开发环境配置:cc+附加包含目录:E:我

2、的文档Visual Studio 2010WpdPackInclude链接器附加库目录:E:我的文档Visual Studio 2010WpdPackLib链接器附加依赖项添加:Packet.lib;wpcap.lib;ws2_32.lib;利用visual studio 10环境,分别整合五个小实验:1)实验一、利用wincpap获取与网络适配器绑定的设备列表:定义类CFindAllDevs,将main函数改掉以方便整合。头文件如下:#include stdafx.h#pragma onceclass CFindAllDevspublic:CFindAllDevs(void);CFindAl

3、lDevs(void);static int findalldevs(void);CFindAllDevs.cpp如下:#include StdAfx.hCFindAllDevs:CFindAllDevs(void)CFindAllDevs:CFindAllDevs(void)int CFindAllDevs:findalldevs()pcap_if_t *alldevs;pcap_if_t *d;int i=0;char errbufPCAP_ERRBUF_SIZE;if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING,NULL,&alldevs,errbuf

4、)= -1)fprintf(stderr,Error in pcap_findalldevs_ex:%sn,errbuf);exit(1); /打印列表for(d=alldevs;d!=NULL;d=d-next)printf(n%d.%sn,+i,d-name);if(d-description)printf(%s)n,d-description);elseprintf(Nodescriotion available)n);if (i =0)printf(nNo interfaces found!Make sure WinPcap is installed.n);return -1;pcap

5、_freealldevs(alldevs);system(pause);return 0;2)实验二、获取网络适配器的高级属性信息:定义CFindAllDevsAdvancedInfo类,头文件如下:#include stdafx.h#pragma onceclass CFindAllDevsAdvancedInfopublic:CFindAllDevsAdvancedInfo(void);CFindAllDevsAdvancedInfo(void); static int findalldevsadvancedinfo(void);CFindAllDevsAdvancedInfo.cpp:#

6、include StdAfx.h#define IPTOSBUFFERS 12CFindAllDevsAdvancedInfo:CFindAllDevsAdvancedInfo(void)CFindAllDevsAdvancedInfo:CFindAllDevsAdvancedInfo(void)char *iptos(u_long in) static char outputIPTOSBUFFERS3*4+3+1; static short which; u_char *p; p=(u_char *)∈ which = (which +1 =IPTOSBUFFERS ?0:which+

7、1); sprintf(outputwhich,%d.%d.%d.%d,p0,p1,p2,p3); return outputwhich; char* ip6tos(struct sockaddr *sockaddr,char *address,int addrlen) socklen_t sockaddrlen; #ifdef WIN32 sockaddrlen = sizeof(struct sockaddr_in6); #else sockaddrlen = sizeof(struct sockaddr_storage); #endif if(getnameinfo(sockaddr,

8、sockaddrlen, address, addrlen, NULL, 0, NI_NUMERICHOST)!= 0) address=NULL; return address;void ifprint(pcap_if_t *d) pcap_addr_t *a; char ip6str128; /打印?名?称? printf(%sn,d-name); /打印?描述?信?息 if (d-description) printf(tDescription:%sn,d-description); printf(tLoopback:%sn,(d-flags &PCAP_IF_LOOPBACK)?YES

9、:NO); /打印?地?址信?息 for(a=d-addresses;a;a=a-next) printf(tAddress Family:#%dn,a-addr-sa_family); switch(a-addr-sa_family) case AF_INET: printf(tAddress Family Name:AF_Inetn); if(a-addr) printf(tAddress:%sn,iptos(struct sockaddr_in*)a-addr)-sin_addr.s_addr); if(a-netmask) printf(tNetmask:%sn,iptos(struc

10、t sockaddr_in*)a-netmask)-sin_addr.s_addr); if(a-broadaddr) printf(tBroadcast Address: %s n,iptos(struct sockaddr_in*)a-broadaddr)-sin_addr.s_addr); if(a-dstaddr) printf(tDestination Address: %sn,iptos(struct sockaddr_in*)a-dstaddr)-sin_addr.s_addr); break; case AF_INET6: printf(tAddress Family Name

11、:AF_INET6n); #ifndef _MINGW32_ if (a-addr) printf(tAddress:%sn,ip6tos(a-addr,ip6str,sizeof(ip6str); #endif break; default: printf(tAddress Family Name:Unknownn); break; printf(n);int CFindAllDevsAdvancedInfo:findalldevsadvancedinfo(void)pcap_if_t *alldevs; pcap_if_t *d; char errbufPCAP_ERRBUF_SIZE+1

12、; if(pcap_findalldevs_ex(PCAP_SRC_IF_STRING,NULL,&alldevs,errbuf)= -1) fprintf(stderr,Error in pcap_findalldevs:%sn,errbuf); exit(1); for(d=alldevs;d;d=d-next) ifprint(d); pcap_freealldevs(alldevs); system(pause);return 0;3)实验三、打开网络适配器并实现抓包功能:定义CPacp_Loop类,头文件如下:#include stdafx.h#pragma onceclass CP

13、acp_Looppublic:CPacp_Loop(void);CPacp_Loop(void);static int pacp_loop(void);CPacp_Loop.cpp:#include StdAfx.hCPacp_Loop:CPacp_Loop(void)CPacp_Loop:CPacp_Loop(void)void packet_dandler(u_char *param,const struct pcap_pkthdr *header,const u_char *pkt_data)struct tm *ltime;char timestr16;time_t local_tv_

14、sec;local_tv_sec= header-ts.tv_sec;ltime=localtime(&local_tv_sec);strftime(timestr,sizeof timestr,%H:%M:%S,ltime);printf(%s,%.6d len:%dn,timestr,header-ts.tv_usec,header-len);int CPacp_Loop:pacp_loop(void)pcap_if_t *alldevs;pcap_t *adhandle; int inum; int i=0; char errbufPCAP_ERRBUF_SIZE; if (pcap_f

15、indalldevs_ex(PCAP_SRC_IF_STRING,NULL,&alldevs,errbuf)=-1) fprintf(stderr,Error in pcap_findalldevs:%sn,errbuf);exit(1); pcap_if_t *d; for(d=alldevs;d;d=d-next) printf(%d.%s,+i,d-name);if(d-description)printf(%s)n,d-description);elseprintf(没有有效的信息描述。)n); if(i=0) printf(n未发现网络接口!n); return -1; printf

16、(请输入要捕获数据包的网络接口编号?(1-%d):,i); scanf(%d,&inum); if(inumi)printf(n接口编号越界n);pcap_freealldevs(alldevs); return -1; for(d=alldevs,i=0;inext,i+); if(adhandle=pcap_open(d-name, 65536, PCAP_OPENFLAG_PROMISCUOUS, 1000, NULL, errbuf )=NULL) fprintf(stderr,n无法打开网络适配器Wincap不支持%sn,d-name);pcap_freealldevs(alldev

17、s); return -1; printf(n在%s上启动监听n,d-description); pcap_freealldevs(alldevs); pcap_loop(adhandle,0,packet_dandler,NULL);return 0;4)实验四、不适用事件处理器进行抓包:定义CPcap_Next_Ex类,头文件如下:#include stdafx.h#pragma onceclass CPcap_Next_Expublic:CPcap_Next_Ex(void);CPcap_Next_Ex(void);static int Pcap_next_ex();CPcap_Next

18、_Ex.cpp:#include StdAfx.hCPcap_Next_Ex:CPcap_Next_Ex(void)CPcap_Next_Ex:CPcap_Next_Ex(void)int CPcap_Next_Ex:Pcap_next_ex()pcap_if_t *alldevs;pcap_if_t *d;pcap_t *adhandle;int inum;int i=0;char errbufPCAP_ERRBUF_SIZE;struct tm *ltime;char timestr16;struct pcap_pkthdr *header;const u_char *pkt_data;i

19、f (pcap_findalldevs_ex(PCAP_SRC_IF_STRING,NULL, &alldevs,errbuf)= -1)fprintf(stderr,Error in pcap_findalldevs:%sn,errbuf);exit(1);for(d=alldevs;d;d=d-next)printf(%d.%s,+i,d-name);if(d-description)printf(%s)n,d-description);elseprintf(No description acailable)n);if(i=0)printf(nNo interfaces found!Mak

20、e sure WinPcap is installed.n);return -1;printf(Enter the interface number(1-%d):,i);scanf(%d,&inum);/如果选择的设备越界,则返回if (inum i)printf(nInterface number out of range.n);pcap_freealldevs(alldevs);return -1;for(d=alldevs,i=0;inext,i+);/打开设备if(adhandle=pcap_open(d-name,/设备名 65536,/要捕捉的数据包的部分/65535保证能捕获到不

21、同数据链路层上的每个数据包的全部内容 PCAP_OPENFLAG_PROMISCUOUS,/混杂模式1000, /读取超时时间NULL,/远程机器验证errbuf/错误缓冲池)=NULL)fprintf(stderr,nUable to open the adapter.%s is not supported by WinPcapn,d-name);/释放设列表pcap_freealldevs(alldevs);return -1;printf(nlistening on %s.n,d-description);/释放设备列表pcap_freealldevs(alldevs);/获取数据包in

22、t res;int outtime = 1;while(res = pcap_next_ex(adhandle,&header,&pkt_data)=0)if(res = 0)outtime += 1;/超时时间到if(outtime10)getchar();char ch;printf(数据包获取超时,是否要继续获取(Y/N):);scanf(%c,&ch);if(ch = N)return 1;elseouttime = 1;continue;time_t local_tv_sec = header-ts.tv_sec;ltime=localtime(&local_tv_sec);strf

23、time(timestr,sizeof timestr,%H:%M:%S,ltime);printf(%s,%.6d len:%dn,timestr,header-ts.tv_usec,header-len);outtime = 1; if(res = -1)printf(Error reading the pcakets:%sn,pcap_geterr(adhandle);return -1;return 0;5)实验五、过滤数据包:定义CUDPDump类,头文件如下:#pragma once#include stdafx.hclass CUDPDumppublic:CUDPDump(voi

24、d);CUDPDump(void);static int UDPdump(void);CUDPDump.cpp:#include StdAfx.hCUDPDump:CUDPDump(void)CUDPDump:CUDPDump(void)typedef struct ip_addressu_char byte1;u_char byte2;u_char byte3;u_char byte4;ip_address;typedef struct ip_headeru_char ver_ihl; /版本(4bits)部首长度(4bits)u_char tos; /服务类型(Type of servic

25、e)u_short stlen; /总长(Total length)u_short identification; /标识(Identification)u_short flags_fo; /标志位u_char ttl; /存活时间(Time to live)u_char proto; /协议(Protocol)u_short crc; /首部检验和(Header checksum)ip_address saddr; /源地址(Source address)ip_address daddr; /目的地址(Destination address) u_int op_pad; /选项与填充?(Op

26、tion+Padding)ip_header;typedef struct udp_headeru_short sport; /源端口(Source port)u_short dport; /目的端口(Destination port)u_short len; /UDP数据包长度(Datagram length)u_short crc; /检验和(Checksum)udp_header;void packet_handler(u_char *param,const struct pcap_pkthdr *header,const u_char *pkt_data)struct tm *ltim

27、e;char timestr16;ip_header *ih;udp_header *uh;u_int ip_len;u_short sport,dport;time_t local_tv_sec;local_tv_sec =header-ts.tv_sec;/将时间戳转换成可识别的格式local_tv_sec =header-ts.tv_sec;ltime=localtime(&local_tv_sec);strftime(timestr,sizeof timestr,%H:%M:%S,ltime);/打印数据包的时间戳和长度printf(%s.%.6d len:%d,timestr,hea

28、der-ts.tv_usec,header-len);/获得IP数据包头布的位置ih=(ip_header *) (pkt_data + 14);/以太网头部长度/获得UDP首部的位置ip_len=(ih-ver_ihl & 0xf)*4;uh=(udp_header *) (u_char*)ih +ip_len);/将网络字节顺序转换成主机的字节顺序sport = ntohs(uh-sport);dport = ntohs(uh-dport);/打印IP地址和UDP端口printf(%d.%d.%d.%d.%d-%d.%d.%d.%d.%dn,ih-saddr.byte1,ih-saddr.

29、byte2,ih-saddr.byte3,ih-saddr.byte4,sport,ih-daddr.byte1,ih-daddr.byte2,ih-daddr.byte3,ih-daddr.byte4,dport);int CUDPDump:UDPdump(void)pcap_if_t *alldevs;pcap_if_t *d;int inum;int i=0;pcap_t *adhandle;char errbufPCAP_ERRBUF_SIZE;u_int netmask;char packet_filter=ip and udp;struct bpf_program fcode;if

30、(pcap_findalldevs_ex(PCAP_SRC_IF_STRING,NULL,&alldevs,errbuf)=-1)fprintf(stderr,Error in pcap_findalldevs:%sn,errbuf);exit(1);/打印列表for(d=alldevs;d;d=d-next)printf(%d.%s,+i,d-name);if(d-description)printf(%s)n,d-description);elseprintf(Nodescriotion available)n);if(i=0)printf(nNo interfaces found!n);

31、return -1;printf(Enter the interface number (1-%d):,i);scanf(%d,&inum);if(inumi)printf(nInterface number out of range.n);pcap_freealldevs(alldevs);return -1;/跳转到已选设备for(d=alldevs,i=0;inext,i+);/打开适配器if(adhandle=pcap_open(d-name,/设备名 65536,/要捕捉的数据包的部分PCAP_OPENFLAG_PROMISCUOUS,/混杂模式1000, /读取超时时间NULL,

32、/远程机器验证errbuf /错误缓冲池)=NULL)fprintf(stderr,nUnable to open the adapter.%s is not supported by Wincpcapn);/释放设备列表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

33、;if(d-addresses!=NULL)/获得接口第一个地址的掩码netmask=(struct sockaddr_in *)(d-addresses-netmask)-sin_addr.S_un.S_addr;else/如果接口没有地址我们假设一个C类的掩码? netmask=0xffffff;/编译过滤器if(pcap_compile(adhandle,&fcode,packet_filter,1,netmask)0)fprintf(stderr,nUnable to compile the pcaket filter,Check the syntax.n);/释放设备列表pcap_f

34、reealldevs(alldevs);return -1;/设置过滤器if(pcap_setfilter(adhandle,&fcode)description);pcap_freealldevs(alldevs);/开始捕捉pcap_loop(adhandle,0,packet_handler,NULL);return 0;6)本程序的主函数:在主函数中利用菜单程序将五个实验整合成一个程序:/ WinPcap_CH9.cpp : 定义?控?制?台应|用?程序的?入?口点?。/#include stdafx.hint menu_select()char s;int cn;printf(=n);printf(| 请选择你想进行的操作: |n);printf(| |n);printf(| 1. 获取网络适配器

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论