发现网络中的活动主机

上传人:艾力 文档编号:31928647 上传时间:2018-02-09 格式:DOC 页数:11 大小:120.50KB
返回 下载 相关 举报
发现网络中的活动主机_第1页
第1页 / 共11页
发现网络中的活动主机_第2页
第2页 / 共11页
发现网络中的活动主机_第3页
第3页 / 共11页
发现网络中的活动主机_第4页
第4页 / 共11页
发现网络中的活动主机_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《发现网络中的活动主机》由会员分享,可在线阅读,更多相关《发现网络中的活动主机(11页珍藏版)》请在金锄头文库上搜索。

1、通信网络设计课程设计发现网络中的活动主机一设计目标:现在一个机房的主机已经达到了一定数量,进行网络管理时,常常需要确定当前网络中处理活动状态的主机。本设计的目标就是编制程序,利用 ICMP 的回送请求和回送响应,来发现指定网段中的活动主机。二设计功能:用命令行形式运行:scanhost Start_IP End_IP,来发现活动主机并显示。(注:scanhost 为程序名, Start_IP 为被搜索望断的起始 IP,End _IP 为其终止 IP。 )显示格式形式如下粗体部分:活动主机:192.168.0.2活动主机:192.168.0.5活动主机:192.168.0.12活动主机:192.

2、168.0.23环境要求:Windows95/98/2000/XP/dos 下能运行,使用 VC+编写程序三设计原理:本设计的主体思想是使用 ICMPECHO 数据包来探测指定网段内的活动主机。具体方法是:通过简单的发送一个 ICMPECHO(Type 8)数据包到目标主机,如果ICMPECHOReply(ICMPtype0)数据包接受到,说明主机是存活状态。如果没有就可以初步判断主机没有在线或者使用了某些过滤设备过滤了 ICMP 的 REPLY。ICMP 全称 Internet Control Message Protocol,工作在 OSI 的网络层。它的中文名为因特网控制报文协议。ICM

3、P 报文要封装在 IP 数据报内部才能传输。其结构如(图一)所示。ICMP 报文的格式如(图二)所示。所有的 ICMP 报文的前 4 个字节都是一样的,但是其他字节互不相同。其中 0-7 位是类型字段,8-15 位是代码字段,16-31 位是校验和字段。校验和字段为 2 个字节,校验的范围是整个 ICMP 报文。本设计仅用到类型为 0 和 8的 ICMP 报文,关于这两种类型报文的具体描述详见(图三) 。20B图一: ICMP 封装在 IP 内部IP 数据报IP 首部 ICMP 报文31(位 )15 167 8类型字段 代码字段 校验和字段0(不同类型和代码有不同内容)图二:ICMP 报文类型

4、 代码 描述0 0 回应应答(Ping 应答,与类型 8 的 Ping 请求一起使用)8 0 回应请求(Ping 请求,与类型 8 的 Ping 应答一起使用)图三:本设计使用的 ICMP 报文类型四设计方法:本设计使用原始套接字生成 ICMP 报文来进行活动主机的探测。设计的大体思想是把包类型设置为回送请求,将它发送给网络上的一个 IP 地址,如果这个 IP 地址已被占用,那么使用这个 IP 地址的主机上的 TCP/IP 软件就能够接收到这个 ICMP 回送请求,并返回一个 ICMP 回送响应信息。由于接收到的回送响应 ICMP 包是封装在 IP 包内,就需要解析该IP 包,从中找到 ICM

5、P 数据信息。相反,如果这个 IP 地址没有人使用,那么发送的 ICMP通信网络设计课程设计回送请求在设定的时延内就不可能得到响应。在初始化原始套接字后,程序就要开始在一个 IP 网段内寻找活动主机。由于在某网段内需要发现的主机很多,为提高效率,采用了多线程编程。主程序和子线程的流程图分别如(图四)和(图五)所示。五程序流程图:NYNNYStart_IPEnd_IP?线程数目太多?创建一个进程并执行Start_IP+构造原始套接字,并初始化建立并初始化目的主机的Sockaddr_in 数据结构 dest起始 IPStart_IP终止 IPEnd_IP_将 Start_IP 填入 dest 中开

6、始结束还有线程在执行?44等待一定时间Y等待一定时间图四:主程序流程图通信网络设计课程设计NNNYYY开始结束填充 ICMP 数据报发送数据报接收数据报去掉 IP 头获取 ICMP 信息数据包太短?不是回送响应?ID 不符合?输出数据报中的 IP 地址图五:子线程流程图通信网络设计课程设计六程序清单:#pragma pack(4)#pragma comment(lib,WS2_32.LIB)#define WIN32_LEAN_AND_MEAN#include#include#include#include#include#include#include/头文件typedef struct i

7、phdr /IP 头unsigned int headlen:4; /IP 头长度unsigned int version:4; /IP 版本号unsigned char tos; /服务类型unsigned short id; /ID 号unsigned short flag; /标记unsigned char ttl; /生存时间unsigned char prot; /协议unsigned short checksum; /效验和unsigned int sourceIP; /源 IPunsigned int destIP; /目的 IPIpHeader;/IP 头部typedef st

8、ruct icmphdr /ICMP 头BYTE type; /ICMP 类型码BYTE code; /子类型码USHORT checksum; /效验和USHORT id; /ID 号USHORT seq; /ICMP 数据报的序列号IcmpHeader;/ICMP 包头部#define ICMP_ECHO 8 /请求回送#define ICMP_ECHO_REPLY 0 /请求回应#define ICMP_MIN 8 /ICMP 包头长度(最小 ICMP 包长度)#define STATUS_FAILED 0xFFFF /错误码#define DEF_PACKET_SIZE 32 /缺省数

9、据块长度#define MAX_PACKET 1024 /最大数据块长度#define MAX_PING_PACKET_SIZE (MAX_PACKET+sizeof(IpHeader)/最大接收数据包长度通信网络设计课程设计void fill_icmp_data(char *,int);USHORT checksum(USHORT *,int);void decode_resp(char *,int,struct sockaddr_in *);DWORD WINAPI FindIP(LPVOID pIPAddrTemp);/函数的申明WSADATA wsaData;SOCKET sockRa

10、w; /原始套接字struct sockaddr_in dest,from,end;/dest:搜索目的 IP,/from:接收 ICMP 包的源 IP/end:搜索终止 IP。int fromlen=sizeof(from); /接收 ICMP 包长度char *recvbuf=new charMAX_PING_PACKET_SIZE; /接受 ICMP 包缓冲区unsigned int addr=0; /IP 地址long ThreadNumCounter=0,ThreadNumLimit=20; /线程数及最大允许线程数long *aa=/全局变量的申明void main(int arg

11、c,char *argv)if(argc!=3) /判断格式是否正确coutThreadNumLimit) /判断线程数目,如果太多,休眠Sleep(5000);continue;DWORD ThreadID;sockaddr_in * pIPAddrTemp=new(sockaddr_in);if(!pIPAddrTemp)couttype=ICMP_ECHO;/设置类型信息icmp_hdr-id=(USHORT)GetCurrentThreadId();/设置其 ID 号为当前线程 ID 号datapart=icmp_data+sizeof(IcmpHeader);/计算 ICMP 数据报

12、的数据部分memset(datapart,A,datasize-sizeof(IcmpHeader);/填入数据/ICMP 数据包的填充void decode_resp(char *buf,int bytes,struct 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_RE

13、PLY)return;if(icmphdr-id!=(USHORT)GetCurrentThreadId()return;coutsin_addr)1)通信网络设计课程设计cksum+=*buffer+;size-=sizeof(USHORT);if(size)cksum+=*(UCHAR*)buffer;cksum=(cksum16)+(cksum cksum+=(cksum16);return (USHORT)(cksum);/效验和的计算DWORD WINAPI FindIP(LPVOID pIPAddrTemp)InterlockedIncrement(aa);/线程数目+1char

14、icmp_dataMAX_PACKET;memset(icmp_data,0,MAX_PACKET);/数据报初始化int datasize=DEF_PACKET_SIZE;/数据报报文的缺省长度datasize+=sizeof(IcmpHeader);/加上 icmp 头部长度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;if(bwrote=SOCKET_ERROR)if(WSAGetLastError()=WSAETIMEDOUT

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 中学教育 > 教学课件 > 高中课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号