版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、目 录 一课程设计目的2二. 课程设计要求2三相关知识2四课程设计分析4五程序流程图7六程序运行结果截图10七. 课程设计心得10八.附录:参考文献 11一课程设计目的: ip协议的优点是简洁,但缺少差错控制和查询机制,而网际控制报文协议(icmp)具有补充ip功能的作用。在网络管理中,常常要确定当前网络中处于活动状态的主机,这时可以通过使用icmp的回送和回送响应消息来完成这项工作。本课程设计的目的就是编制程序,利用icmp数据包,发现指定网段中的活动主机。通过课程设计,使学生更加熟悉icmp报文的结构,对icmp协议有更好的理解和认识。二课程设计要求: 设计程序,其功能是发送icmp数据包
2、,以获取指定网段中的活动主机,并将结果显示在标准输出上。 程序的具体要求如下:1) 用命令行形式运行: scanhost start_ip end_ip其中scanhost为程序名;start_ip为被搜索网段的开始ip地址;end_ip为被搜索网段的结束ip地址。2)输出格式为: 活动主机1 活动主机2 三相关知识:编制程序前首先要对icmp报文的格式有一定的了解,icmp报文是在ip数据报内部传输的,其结构如图10-1所示: ip数据报 ip首部 icmp报文icmp报文的格式如图10-2所示:0 7 8 15 16 31(位)类型字段代码字段校验和字段(不同类型和代码有不同内容)所有报文
3、的前4个字节都是一样的,但是其它字节则互不相同。其中类型字段可以有15个不同的值,以描述特定类型的icmp报文,某些icmp报文还使用代码字段的值来进一步描述不用的条件。按验和字段为2字节,校验的范围是整个icmp报文。检验和是必须的,其计算方法与ip协议头部校验和的计算方法一样。 各种类型的icmp报文如图10-3所示(icmp报文类型),不同类型由报文中的类型字段和代码字段来共同决定。类 型 代 码 描 述 0 0 回送响应(ping应答)3 目的不可达0 网络不可达1 主机不可达2 协议不可达3 端口不可达4 需要进行分片但设置了禁止分片比特5 源主机选择路由失败6 无法识别目的网络7
4、无法识别目的主机8 源主机被隔离9 目的网络被禁止10 目的主机被禁止11 由于服务类型(tos),网络不可达12 由于服务类型(tos),主机不可达13 由于过滤,通信被强行禁止14 主机越权15 优先权终止生效 4 0 源端被关闭(基本流控制)5 重定向0 对网络重定向1 对主机重定向2 对服务类型和网络重定向3 对服务类型和主机重定向 8 0 回送请求(ping请求)9 0 路由器通告10 0 路由器请求11 超时0 传输期间生存期减为01 数据报组装期间生存期减为012 参数问题0 各种ip头部错误1 缺少必须的选项13 0 时间戳请求14 0 时间戳应答15 0 信息请求(已作废)1
5、6 0 信息应答(已作废)17 0 地址掩码请求18 0 地址掩码应答10-3 icmp报文类型本课程设计的目的是发现网络中的活动主机,就是使用icmp的回送和回送响应消息发现网络中的活动主机,即ping消息的请求和应答。那幺,发送的icmp的数据包类型设置为回送请求(类型号为8)。四课程设计分析: 本程序使用原始套接字生成icmp报文来进行活动主机的探查。这个程序使用的是回送请求与应答消息。程序的大致思想是把icmp的数据包类型设置为回送请求,将它发送给网络上的一个ip地址,如果这个ip地址已经被占用的话,那幺使用位于这个ip地址的主机上的tcp/ip软件就能够接收到这个icmp回送请求,从
6、而返回一个icmp回送响应(类型号为0)信息。信息封装在一个ip包中,我们需要解析该ip包,从中找到icmp数据信息。相反,如果这个ip地址没有人使用,那幺发送的icmp回送请求在设定的延时内就不可能得到响应。 在初始化原始套接字之后,本程序就要开始在一个ip网段内寻找活动主机。因为要寻找的主机可能很多,为节省时间可以采用多线程编程。下面接结合核心代码对程序的具体实现进行讲解,同时为使程序流程更加清晰,去掉了错误检查等保护性代码。1.使用原始套接字 为了实现发送/监听icmp报文,必须使用原始套接字,创建原始套接字的代码如下: socket sockraw; sockraw = wsaocke
7、t (af_inet, sock_raw, ipproto_icmp, null, 0, wsa_flag_overlapped); 在wsasocket函数中,我们使用ipproto_icmp表示接收icmp数据包,为了使用发送超时设置(设置so_rcvtimeo或so_sndtimeo),必须将标志位置为wsa_flag_overlapped。然后调用setsockopt函数设置读取延迟。 int timeout=1000;setsockopt(sockraw,sql_socket,so_rcvtimeo,(char*)&timeout,sizeof(timeout);setsockopt
8、(sockraw,sql_socket,so_sndtimeo,(char*)&timeout,sizeof(timeout) 在setsockopt函数中,sockraw是之前创建的原始套接字,设置sql_socket表明使用基本套接字处理icmp报文。设置so_rcvtimeo表示使用接收超时设置,so_sndtimeo表示使用发送超时设置,在这里,超时时间均设置为1000ms。 2定义ip头部和icmp头部的数据结构 由于socket发送/捕获的是ip包,因此要分别定义ip头部的数据结构icmp头部数据结构。 /ip报头的数据结构 typedef struct iphdrunsigned
9、 int headlen:4; /ip头长度unsigned int version:4; /ip版本号unsigned char tos; /服务类型unsigned short totallen; /ip包总长度 unsigned short id; /id号unsigned short flag; /标记unsigned char ttl; /生存时间unsigned char prot; /协议(udp tcp)nsigned short checksum; /校验和unsigned int sourceip; /源ipunsigned int destip; /目的ipipheade
10、r;/icmp头部的数据结构typedef struct icmphdr byte type; /icmp类型码,回送请求的类型码为8 byte code; /子类型码,保存与特定icmp报文类型相关细节信息 ushort checksum; /校验和 ushort id; /icmp报文id号(一般用进程号作id) ushort seq; /icmp数据报的序列号icmpheader;3填充并发送回送请求类型的icmp报文 为了使收到数据包的目的主机发送响应,我们需要向目的主机发送回送请求类型的icmp报文。从图10-3中可知,回送请求的类型号为8。因此icmp报文的填充代码如下:#defi
11、ne icnp_echo 8 /请求回送#define def_packet_size 32 /缺省数据报长度#define max_packet 1024 /最大数据块长度char icmp_datamax_packet; /icmp数据报最大可能的长度memset(icmp_data,0,max_packet); /将数据报清空初始化int datasize=def_packet_size; /icmp数据报报文体的缺省长度datasize+=sizeof(icmpheader); /再加上icmp头部的长度icmpheader*icmp_hdr:char *datapart;icmp_h
12、dr = (icmpheader*)icmp_data;icmp_hdr-type = icmp_echo; /设置类型icmp_hdr-id = (ushort)getcurrentthreadid(); /设置其id号为当前线程号datapart = icmp_data + sizeof(icmpheader); /计算出数据报的数据部分memset(datapart,a,datasize-sizeof(icmpheader); /填入数据(icmpheader*)icmp_data)-seq= 0; /序列号为0(icmpheader*)icmp_data)-checksum = 0;
13、/先将校验和置0(icmpheader*)icmp_data)-checksum = checksum(ushort*)icmp_data,datasize);checksum为校验和的函数,设校验和初值为0 ,然后对数据每16为求异或,结果取反,便得校验和。其代码如下: ushort checksum(ushort *buffer, int size) 计算校验和 unsigned long cksum = 0; while(size1) cksum+=*buffer+; size -=sizeof(ushort);if(size) cksum += (uchar*)buffer; cksu
14、m = (cksum 16)+(cksum & 0xffff);cksum +=(cksum 16);return(ushort)(-cksum); 填充icmp报文之后,应在icmp报文之前加上ip报头并发送出去。可调用下面的代码发送数据包。注意,这里的dest是填入目的主机ip地址的一个sockaddr_in数据结构,ipstring是目的主机的ip地址字符串。 struct sockaddr_in dest; dest.sin_family = af_inet; dest.sin_addr.s_addr = inet_addr(ip_string); /填入搜索的ip地址 sendto(
15、sockraw,icmp_data,datasize,0,(sockaddr*)&dest,sizeof(dest);4.解析数据包如果所ping的目的主机所在,那么它会发送一个回送应答包。这是一个ip包,收到后解析此数据包并获取其中的icmp信息。根据ip报头信息中的ip报头长度字段,就可以得到icmp报文的真实地址。icmp数据包中的ip地址就是活动主机的ip。代码如下: #define icmp_min 8 /icmp报文头长度(最小icmp报文长度) #define max_ping_packet_size (max_packet + sizeof(ipheader) char *re
16、cvbuf=new charmax_ping_packet_size; /保证大与发送包的大小 /from是一个sockaddr_in数据结构,用于保存响应的目的的主机的地址 struct sockaddr_in from; int fromlen = sizeof(from); int bytes = recvfrom(sockraw,recvbuf,max_packet, 0,(struck sockaddr*)&from),&fromlen); ipheader *iphdr; icmpheader *icmphdr; unsigned short iphdrlen; iphdr=(ip
17、header *)buf; iphdrlen = iphdr-headlen*4 ; /ip报头的长度 icmphdr=(icmpheader *)(buf+iphdrlen); /跳过ip报头 /数据包太短,丢弃 if(bytestype !=icmp_echo_reply) return; /id号不相符,丢弃 if(icmphdr-id!=(ushot)getcurrentthreadid() return; /输出正在使用的ip地址。 cout”活动主机:”sin_addr)endl;五程序流程图:一个用多线程实现的程序在第三部分中给出(课程设计分析中的第三部分),以下分别是子程序流程
18、图和主程序流程图(程序见附录):1子程序流程图:开 始填充icmp数据报发送数据报接收数报去掉ip报头,获取icmp信息数据包太短? y n不是回送响应? y nid不符合? y n输出数据报中的ip地址 结 束 图1.子程序流程图2主程序流程图:开 始将start_ip添入到dest中起始ip地址start_ip结束ip地址end_ip建立并初始化目的主机的sockaddr_in数据结构dest构造原始套接字,并初始化start_ipend_ip? n y y线程数目太多?等待一定时间 n创建一个线程并执行start_ip+ y 还有线程在执行?等待一定时间 n结 束 图2.主程序流程图六程
19、序运行结果截图: 图3.运行结果七课程设计心得:附录:参考文献1 吴功宜、胡晓英等.计算机网络课程设计,北京:机械工业出版社,2007.122 胡晓英等;计算机网络课程设计;北京:机械工业出版社,2005.93 郭国强等;计算机网络与internet教程;北京:清华出版社,2006.114 杨丰瑞 杨丰任;实用教程最新计算机网络;北京:中国铁道出版社,2001.7源代码:#pragma pack(4)/#include stdafx.h#pragma comment (lib,ws2_32.lib)#define win32_lean_and_mean#include #include #in
20、clude #include #include #include #include typedef struct iphdrunsigned int headlen:4;unsigned int version:4;unsigned char tos;unsigned short totallen;unsigned short id;unsigned short falg;unsigned char ttl;unsigned char prot;unsigned short checksum;unsigned int sourceip;unsigned int destip;ipheader;
21、typedef struct icmphdrbyte type;byte code;ushort checksum;ushort id;ushort seg;icmpheader;#define icmp_rcho 8#define icmp_rcho_reply 0#defineicmp_min 8#define status_failed 0xffff#definedef_packet_size 32#define max_packet 1024#define max_ping_packet_size (max_packet+sizeof(ipheader)void fill_icmp_d
22、ata(char *,int);ushort checksum(ushort *,int);void decode_resp(char *,int,struct sockaddr_in *);dword winapi findip(lpvoid pipaddrtemp);wsadata wsadata;socket sockraw;struct sockaddr_in dest,from,end;int fromlen =sizeof(from);char *recvbuf=new charmax_ping_packet_size;unsigned int addr=0;long thread
23、numcounter=0,threadnumlimit=20;long *aa=&threadnumcounter;void main(int argc,char *argv)/*if(argc!=3)cout输入格式错误: start_ip end_ipendl;return;*/if(wsastartup(makeword(2,1),&wsadata)!=0)coutwasstartup failedgetlasterror()endl;exitprocess(status_failed);sockraw=wsasocket(af_inet,sock_raw,ipproto_icmp,nu
24、ll,0,wsa_flag_overlapped);if(sockraw=invalid_socket)coutwassocketet() faliedwsagetlasterror()endl;exitprocess(status_failed);int timeout=1000;int bread=setsockopt(sockraw,sol_socket,so_rcvtimeo,(char *)&timeout,sizeof(timeout);if(bread=socket_error)coutfailed to sey recv timeoutwsagetlasterror()endl
25、;exitprocess(status_failed); timeout=1000; bread=setsockopt(sockraw,sol_socket,so_sndtimeo,(char *)&timeout,sizeof(timeout); if(bread=socket_error)coutfailed to sey recv timeoutwsagetlasterror()endl;exitprocess(status_failed);memset(&dest,0,sizeof(dest);unsigned long startip,endip;dest.sin_family=af
26、_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)sleep(5000);continue;dword threadid;sockaddr_in *pipaddrtemp=new (sockaddr_in);if(!pipaddrtemp)cou
27、tmemory alloc failedendl;return ;*pipaddrtemp=dest;clock_t start;start=clock();hthread=createthread(null,null,findip,(lpvoid)pipaddrtemp,null,&threadid);long i=60000000l;while(i-);terminatethread(hthread,0);interlockeddecrement(aa);memset(&from,0,sizeof(from);startip=htonl(htonl(startip)+1);dest.sin
28、_addr.s_addr=startip;while(threadnumcounter!=0)sleep(2000);return;couterrortype=icmp_rcho;icmp_hdr-id=(ushort)getcurrentthreadid();datapart=icmp_data+sizeof(icmpheader);memset(datapart,a,datasize-sizeof(icmpheader);void decode_resp(char *buf,int bytes,struct sockaddr_in *from)ipheader *iphdr;icmphea
29、der *icmphdr;unsigned short iphdrlen;iphdr=(ipheader*) buf;iphdrlen=iphdr-headlen*4;icmphdr=(icmpheader *)(buf+iphdrlen);if(bytestype!=icmp_rcho_reply)return;if(icmphdr-id!=(ushort)getcurrentthreadid()return;cout活动主机: endl;cout sin_addr)1)cksum+=*buffer+;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
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度木材行业节能减排技术改造合同范本8篇
- 2025年洗车场场地租赁合同:专业洗车服务协议范本3篇
- 2025版外架班组劳务分包及智慧工地合同2篇
- 碎石购买与工程预算控制2025年度合同2篇
- 2025版卫生间装修施工与环保材料采购合同2篇
- 羽绒制品企业发展战略咨询2025年度合同3篇
- 2025版图书馆特色馆藏建设采购合同3篇
- 2025年度高科技产品买卖合同书样本4篇
- D打印技术在建筑外立面设计的应用考核试卷
- 二零二五版4S店尊贵订车合同模板2篇
- 2025年山东浪潮集团限公司招聘25人高频重点提升(共500题)附带答案详解
- 2024年财政部会计法律法规答题活动题目及答案一
- 2025年江西省港口集团招聘笔试参考题库含答案解析
- (2024年)中国传统文化介绍课件
- 液化气安全检查及整改方案
- 《冠心病》课件(完整版)
- 2024年云网安全应知应会考试题库
- 公园保洁服务投标方案
- 光伏电站项目合作开发合同协议书三方版
- 2024年秋季新沪教版九年级上册化学课件 第2章 空气与水资源第1节 空气的组成
- 香港中文大学博士英文复试模板
评论
0/150
提交评论