《[计算机]发现网络中的活动主机报告及源代码》由会员分享,可在线阅读,更多相关《[计算机]发现网络中的活动主机报告及源代码(26页珍藏版)》请在金锄头文库上搜索。
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_hdr = (IcmpHeader*)icmp_data;Icmp_hdr-type = ICMP_ECHO; /设置类型Icmp_hdr-id = (USHORT)GetCurrentThreadId(); /设置其ID号为当前线程号Datapart = icmp_data + sizeof(IcmpHeader); /计算出数据报的数据部分Memset(datapart,A