《网络协议编程》课程设计报告ICMP扫描程序的设计与实现 .doc

上传人:文库蛋蛋多 文档编号:2385785 上传时间:2023-02-17 格式:DOC 页数:24 大小:134KB
返回 下载 相关 举报
《网络协议编程》课程设计报告ICMP扫描程序的设计与实现 .doc_第1页
第1页 / 共24页
《网络协议编程》课程设计报告ICMP扫描程序的设计与实现 .doc_第2页
第2页 / 共24页
《网络协议编程》课程设计报告ICMP扫描程序的设计与实现 .doc_第3页
第3页 / 共24页
《网络协议编程》课程设计报告ICMP扫描程序的设计与实现 .doc_第4页
第4页 / 共24页
《网络协议编程》课程设计报告ICMP扫描程序的设计与实现 .doc_第5页
第5页 / 共24页
点击查看更多>>
资源描述

《《网络协议编程》课程设计报告ICMP扫描程序的设计与实现 .doc》由会员分享,可在线阅读,更多相关《《网络协议编程》课程设计报告ICMP扫描程序的设计与实现 .doc(24页珍藏版)》请在三一办公上搜索。

1、长沙理工大学网络协议编程课程设计报告帅哥 学 院 计通学院 专 业 网络工程 班 级 网络08-02班 学 号 200858080110 学生姓名 帅 哥 指导教师 刘 青 课程成绩 完成日期 2011年6月15日 课程设计成绩评定学 院 计通学院 专 业 网络工程 班 级 网络08-02班 学 号 200858080110 学生姓名 帅哥 指导教师 刘 青 完成日期 2011年7月2日 指导教师对学生在课程设计中的评价评分项目优良中及格不及格课程设计中的创造性成果学生掌握课程内容的程度课程设计完成情况课程设计动手能力文字表达学习态度规范要求课程设计论文的质量指导教师对课程设计的评定意见综合成

2、绩 指导教师签字 2011年 月 日课程设计任务书计算机与通信工程学院 网络工程专业 课程名称网络技术课程设计时间20102011学年第二学期1718周学生姓名帅哥指导老师刘青题 目ICMP扫描程序的设计与实现主要内容:(1)了解ICMP协议,知道ICMP协议的概念,内容,重要性等。(2) 学会编写ICMP扫描程序。要求:(1)综合运用计算机网络基本理论和编程语言设计本系统。(2)学会文献检索的基本方法和综合运用文献的能力。(3)通过课程设计培养严谨的科学态度,认真的工作作风和团队协作精神。应当提交的文件:(1)课程设计学年论文。(2)课程设计附件(相关图纸、设备配置清单、报告等)。ICMP扫

3、描程序的设计与实现学生姓名:帅哥 指导教师:刘青摘要:我们常用Ping程序来判断一个特定的主机是否处于活动状态.该程序发送一个ICMP回应请求报文给主机,然后等待返回的ICMP报文回应应答就可以知道自己是否能成功的访问到那台机器.本次课程设计涉及到MFC的应用,要在充分了解套接字的实现以及IP,ICMP的格式,功能等的基础上才能实现此设计。关键字:ICMP;扫描;程序;协议;目 录1 引言31.1 课程设计目的31.2 课程设计要求32 概要设计42.1 设计原理42.2 数据结构设计42.3 系统流程图63 详细设计83.1 ICMP报文分析83.2 程序功能分析94 测试结果124.1 遇

4、到问题124.2 测试结果125 结束语13参考文献14附录及源代码151 引言1.1 课程设计目的IP协议的优点是简单,但缺少差错控制和查询机制,而网际控制报文协议(ICMP具有补充IP功能的作用。在网络管理中,常常要确定当前网络在红处于活动状态的主机,这时可以通过ICMP的回送和回送响应消息来完成这项工作。这课程设计的目的就是编制程序,利用ICMP数据包,发现网络中的活动主机,即ping消息的请求和应答。通过课程设计,熟悉ICMP报文的结构,对ICMP协议有更好的理解和认识,培养综合运用网络知识解决实际问题能力。1.2 课程设计要求设计程序,其功能是发送ICMP数据包,以获取指定望段中的活

5、动主机,并将结果显示在标准输出设备上程序的具体要求如下:1用命令形式运行scanhost为程序名;start_ip为被搜索网段;end_ip为被搜索网段的结束IP地址。如在命令行输入 scanhost 192.168.0.1 192.168.0.1002输出格式活动主机1的IP地址活动主机2的IP地址 活动主机 n的IP地址2 概要设计2.1 设计原理本程序使用的原始套接字生成ICMP请求/应答报文来进行活动主机的探查。这个程序使用的是回送请求和应答消息。程序的大致思想是把ICMP的数据报类型设置为回送请求,将它发送给网络上的一个IP地址,如果这个IP地址已经被占用的话,那么使用位于这个IP地

6、址的主机上的TCP/IP软件就能接受到这个ICMP回送请求,从而返回一个ICMP回送请求(类型号为0)信息。信息封装在一个IP包中,我们需要解析该IP包,从中找到ICMP数据信息,相反,如果这个IP地址没有人使用,那么发送的ICMP回送请求在设定的延时内就不可能得到响应。2.2 数据结构设计 2.2.1IP头部数据结构typedef struct iphdr unsigned int headlen:4; /ip头长度 unsigned int wersion:4; /ip版本号 unsigned char tos; /服务类型unsigned short totallen; /ip包总长度u

7、nsigned short id; /ip号unsigned short flag; /标记unsigned char ttl; /生存时间unsigned char prot; /协议(UDP TCP)unsigned short checksum; /校验和unsigned int sourceip; /源ipunsigned int destip; /目的ipIpHeader;2.2.2ICMP头部数据结构 typedef struct icmphdr BYTE type; /icmp类型码,回送请求的类型码为8 BYTE code; /子类型码,保存与特定ICMP报文类型相关的细节信息

8、 USHORT checksum; /校验和 USHORT id; /ICMP报文id号 USHORT seq; /ICMP数据报的序列号Icmpheader;2.3 系统流程图2.3.1主流程图 (图1) 开 始构造原始套接字,并初始化建立并初始化木的主机的Sockaddr_in数据结构dest起始IP地址-start_ip结束IP地址-end ip将start_ip填入到dest中start_iptype=icmp_echo; /设置类型 icmp_hdr-id=(ushort)getcurrentthreadid(); /设置其ID号为当前线程号 datapart=icmp_data+s

9、izeof(icmpheader); /计算出ICMP数据报的数据部分memset(datapart,A,datasize-sizeof(icmphearder); /填入数据 ((IcmpHeader*)icmp_data)-seq=0; /序列号 ((IcmpHeader*)icmp_data)-check_sum=0; /先将检验和置0((IcmpHead*)icmp_data)-checksum=checksum(USHORT*) icmp_data,data_size);Checksum 为计算校验和的函数,设校验和初值为0,然后对数据每16位求异或,结果取反,便得校验和。其代码如下

10、:unsinged long cksum=0;while (size1)cksum+=*buffer+;size-=sizeof(ushort);if(size)cksum+=*(uchar)buffer;cksum=(cksum16)+(cksum&0xffff);cksum+=(cksum16);return (ushort)(cksum); 填充ICMP报文之后,应在ICMP报文之前加上IP报头并发送出去。可调用下面的代码发送数据包。注意,这里的dest是填入目的主机的IP地址的一个sockaddr_in数据结构,IP_STRING是目的的主机的IP地址字符串。 Struct socka

11、ddr_in_dest; Dest.sin_family=AF_INET; Dest.sin_addr.s_addr=inet_addr(IP_STRING); Sendto(sockraw,icmp_data,datasize,0,(sockaddr*)&dest,size of(dest);3.2.4解析数据包 如果所ping的目的主机存在,那么它会发出一个回送应答包。这是一个IP包,受到后解析此数据包并获得其中的ICMP信息。根据IP报头信息中的IP报头长度字段,就可以得到ICMP报文的真实地址。ICMP数据包中的IP地址就是活动主机的IP。代码分析如下: #define ICMP_MI

12、N 8 #define MAX_PING_PACKET_SIZE(MAX_PACKET+sizeof(IpHeader) char *recvbuf=newMAX_PING_PACKET_SIZE; struct sockaddr_in dest,from,end;int formlen=sizeof(from); int bytes=recvfrom(sockraw,recvbuf,MAX_PACKET,0,(Struct sockaddr*)&from,&fromlen) ipheader *iphdr; icmpheader *icmphdr; unsigned short iphdrl

13、en; iphdr=(ipheader*)buf; iphdrlen=iphdr-headlen*4; /IP报头的长度 icmphdr=(icmpheader *)(buf+iphdrlen); /跳过IP头 /数据包太短 丢弃 if(bytestype!=icmp_echo_reply) return; /ID不相符,丢弃if(icmphdr-id!=(USHORT)getcurrentthreadid() return; /输出正在使用的IP地址 cout活动主机sin_addr)endl;4 测试结果4.1 遇到问题1 找不到头文件。因为头文件存放位置错误。2 变量没有定义。因为变量没

14、有定义和变量名书写写错。3 指针书写错误。4 宏参数列表错误。5 结构体指针传递错误。Cannot covert from struct iphdr * to struct icmphar * ip Ipheader * iphdr.因为缺少成员运算符”.”。4.2 测试结果 经反复调试,运行正常,运行结果如下(图5)5 结束语回顾过去的一个星期,有紧张,有忙碌,有苦恼,也有欢笑,在不断的改进与努力中,终于可以实现利用ICMP发现网络上的活动主机。通过这次课程设计,我加深了对ICMP协议的理解,巩固了课堂知识,为以后学习网络协议打下基础。在课程设计中,我和搭档李宝详配合的很融洽,相互帮助,共同

15、进步。在调试过程中难免要出现一些问题,为了能够快速地确定错误的原因,尽快的排除程序逻辑错误,通常把程序错误划分为三种类型:语法错误、运行错误和逻辑错误。在这次网络课程设计中,也发生了这样那样的错误,如变量没有定义、缺少头文件。通过查阅文献资料、请教老师和同学讨论,以及自己认真地分析与思考,逐一对错误进行了调试,使程序基本能正常运行,大体上符合了设计的意图和设计的要求。由于网络协议比较抽象,比较难学,也学得不深入,何况还要把所学知识运用到实践中来,真是一大难题,所以一开始时,真是有点一筹莫展,网上查有关资料却总觉得不搭干。通过这次课程设计,我明白做什么事都要沉得下心,在搞任何研发工作时,遇到问题

16、沉着冷静是特别重要的,千万不能有半点浮躁的心情。在程序的调试过程中,出现问题是正常的,关键是如何去发现问题的根源,然后去解决它。其实写程序并不是很花时间,改错才是最花时间的的事情。还有一点特别重要的是,在设计过程中或者是改错的过程中遇到棘手的问题时,借助网络去解决的确是一种很好的选择。一个星期的课程设计,我过的很充实,感觉每天都在学习,每天都在进步,在课程设计完成之际,我在此向所有关心我帮助我的刘老师和同学们致以最真诚的感谢。在这次课程设计中,我从刘老师身上学到了很多东西,他认真负责,知识丰富,要求严格,无论在理论上还是在系统调试中,都给与我很大的帮助,使我得到很大的提高,这对于我以后的工作和

17、学习都有一种巨大的帮助,在此再次感谢刘老师耐心的耐心辅导。参考文献1吴功宜,胡晓英等著.计算机网络课程设计.北京:机械工业出版社。20052周明天等,TCP/IP网络原理与技术.北京:清华大学出版社.3陈坚,陈伟.Visual C+网络高级编程M.北京:人民邮电出版社,2001.4方路平,曹平,林毅,等采用IP多址广播技术的应用系统开发J.计算机系统应用,20015蒋东兴.WindowsSockets网络程序设计大全M.北京:清华大学出版社,1999.附录及源代码 1. scanhost.h#pragma pack(4)#pragma comment(lib,Ws2_32.lib)#defin

18、e win32_LEAN_AND_MEAN#include #include #include #include #include #include /THE IP HEADERtypedef struct iphdr unsigned int headlen:4; /ip头长度 unsigned int wersion:4; /ip版本号 unsigned char tos; /服务类型unsigned short totallen; /ip包总长度unsigned short id; /ip号unsigned short flag; /标记unsigned char ttl; /生存时间u

19、nsigned char prot; /协议(UDP TCP)unsigned short checksum; /校验和unsigned int sourceip; /源ipunsigned int destip; /目的ipIpHeader;/ICMP HEADERtypedef struct icmphdr BYTE type; /icmp类型码,回送请求的类型码为8 BYTE code; /子类型码,保存与特定ICMP报文类型相关的/节信息 USHORT checksum; /校验和 USHORT id; /ICMP报文id号 USHORT seq; /ICMP数据报的序列号Icmphe

20、ader;#define ICMP_ECHO 8 /请求回送#define ICMP_ECHO_REPLY 0 /请求回应#define ICMP_MIN 8 /ICMP包头长度(最小ICMP包长度)#define STATUS_FAILED 0xFFFF /错误码#define DEF_PACKET_SIZE 32 /缺省数据报长度#define MAX_PACKET 1024 /最大数据报长度#define MAX_PING_PACKET_SIZE (MAX_PACKET + sizeof(IpHeader) /最大接受数据报长度void fill_icmp_date(char * ,in

21、t); /填充ICMP包USHORT checksum(USHORT *,int); /校验和函数void decode_resp(char*,int,struct sockaddr_in *); /找到此数据报IP地址DWORD WINAPI FindIp(LPVOID pipaddrtemp); /线程调用子函数2. scanhost.cpp #include scanhost.hWSADATA wsadata;SOCKET sockraw;struct sockaddr_in dest,from,end;int fromlen=sizeof(from);char * recvbuf=ne

22、w charMAX_PING_PACKET_SIZE;unsigned int addr=0;long threadnumcounter=0,threadnumlimit=20;long *aa=&threadnumcounter;void main(int argc,char *argv)if(argc!=3)cout输入格式错误:scanhost start_ip end_ipendl;return;if(WSAStartup(MAKEWORD(2,1),&wsadata)!=0)coutWSAStartup failed:GetLastError()endl;ExitProcess(ST

23、ATUS_FAILED);/创建原始套接字sockraw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,WSA_FLAG_OVERLAPPED);if(sockraw=INVALID_SOCKET)coutWSASocket() failed:WSAGetLastError()endl;ExitProcess(STATUS_FAILED); /设置读取延时 int timeout=1000; int bread=setsockopt(sockraw,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout,sizeof(tim

24、eout); if(bread=SOCKET_ERROR) coutfail to set recv timeout:WSAGetLastError()endl; ExitProcess(STATUS_FAILED); timeout=1000; bread=setsockopt(sockraw,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout,sizeof(timeout); if(bread=SOCKET_ERROR) coutfailed to set send timeout:WSAGetLastError()endl; ExitProcess(STATUS

25、_FAILED); memset(&dest,0,sizeof(dest); unsigned long startip,endip; dest.sin_family=AF_INET; dest.sin_addr.s_addr=inet_addr(argv1); startip=inet_addr(argv1); end.sin_family=AF_INET; end.sin_addr.s_addr=inet_addr(argv2); endip=inet_addr(argv2); HANDLE hthread; while(htonl(startip)threadnumlimit) Slee

26、p(5000); continue; DWORD Threadid; sockaddr_in * pipaddrtemp=new(sockaddr_in); if(!pipaddrtemp) coutmemory alloc failedtype = ICMP_ECHO;icmp_hdr-id=(USHORT)GetCurrentThreadId();datapart=icmp_data+sizeof(Icmpheader);memset(datapart,A,datasize-sizeof(Icmpheader);void decode_resp(char *buf,int bytes,st

27、ruct sockaddr_in *from)IpHeader *iphdr;Icmpheader *icmphdr;unsigned short iphdrlen;iphdr=(IpHeader *)buf;iphdrlen=iphdr-headlen * 4;icmphdr=(Icmpheader *)(buf+iphdrlen); /数据包太短 丢弃if(bytestype!=ICMP_ECHO_REPLY) return;if(icmphdr-id!=(USHORT)GetCurrentThreadId() return;cout活动主机sin_addr)1)cksum+=*buffe

28、r+; size-=sizeof(USHORT); if(size)cksum+=*(UCHAR*)buffer; cksum=(cksum16)+(cksum & 0xffff); cksum+=(cksum16); return (USHORT)(cksum);DWORD WINAPI FindIp(LPVOID pipaddrtemp)InterlockedIncrement(aa); char icmp_dataMAX_PACKET; memset(icmp_data,0,MAX_PACKET); int datasize=DEF_PACKET_SIZE; datasize+=size

29、of(Icmpheader); fill_icmp_data(icmp_data,datasize); (Icmpheader*)icmp_data)-checksum=0; (Icmpheader*)icmp_data)-seq = 0;/计算校验和后填入 (Icmpheader*)icmp_data)-checksum=checksum(USHORT*)icmp_data,datasize); int bwrote=sendto(sockraw,icmp_data,datasize,0,(struct sockaddr*)pipaddrtemp,sizeof(dest); int n=0;

30、 if (bwrote=SOCKET_ERROR) if(WSAGetLastError()=WSAETIMEDOUT) couttimed outendl; coutsendto failed: WSAGetLastError()endl; ExitProcess(STATUS_FAILED); n=1;if(bwrotedatasize)coutworte bwrote bytesendl;ExitProcess(STATUS_FAILED);n=1;int bread =recvfrom(sockraw,recvbuf,MAX_PING_PACKET_SIZE,0,(struct sockaddr*) &from,&fromlen);if(bread=SOCKET_ERROR)if(WSAGetLastError()=WSAETIMEDOUT)couttime outendl; coutrecvform failed:WSAGetLastError()endl;ExitProcess(STATUS_FAILED);n=1;if(n=0)decode_resp(recvbuf,bread,&from);InterlockedDecrement(aa);return 0;

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号