




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、计算机网络课程设计报告题目: 发现网络中的活动主机 专业班级: 计科10102班 姓名: 朱林 学号: 7 同组姓名: 谭莫然、谭斌、李绥海 成绩评定指导教师:年月日目录1.设计目标:32.设计功能:33.设计原理:34.设计方法:45.程序流程图:46.程序清单:67.实验步骤及测试128.总结:139.参考资料:141.设计目标:现在一个机房的主机已经达到了一定数量,进行网络管理时,常常需要确定当前网络中处理活动状态的主机。本设计的目标就是编制程序,利用ICMP的回送请求和回送响应,来发现指定网段中的活动主机。2.设计功能:用命令行形式运行:scanhost Start_IP End_IP
2、,来发现活动主机并显示。(注:scanhost为程序名,Start_IP为被搜索望断的起始IP,End _IP为其终止IP。)显示格式形式如下粗体部分:活动主机:172.16.201.11活动主机:172.16.201.12活动主机:172.16.201.13活动主机:172.16.201.15环境要求:Windows95/98/2000/XP/dos下能运行,使用VC+编写程序3.设计原理:本设计的主体思想是使用ICMPECHO数据包来探测指定网段内的活动主机。具体方法是:通过简单的发送一个ICMPECHO(Type 8)数据包到目标主机,如果ICMPECHOReply(ICMPtype0)
3、数据包接受到,说明主机是存活状态。如果没有就可以初步判断主机没有在线或者使用了某些过滤设备过滤了ICMP的REPLY。ICMP全称Internet Control Message Protocol,工作在OSI的网络层。它的中文名为因特网控制报文协议。ICMP报文要封装在IP数据报内部才能传输。其结构如(图一)所示。ICMP报文的格式如(图二)所示。所有的ICMP报文的前4个字节都是一样的,但是其他字节互不相同。其中0-7位是类型字段,8-15位是代码字段,16-31位是校验和字段。校验和字段为2个字节,校验的范围是整个ICMP报文。本设计仅用到类型为0和8的ICMP报文,关于这两种类型报文的
4、具体描述详见(图三)。20B图一: ICMP封装在IP内部IP数据报IP首部ICMP报文31(位)15 167 8类型字段代码字段校验和字段0(不同类型和代码有不同内容)图二:ICMP报文类型代码描述00回应应答(Ping应答,与类型8的Ping请求一起使用)80回应请求(Ping请求,与类型8的Ping应答一起使用)图三:本设计使用的ICMP报文类型4.设计方法:本设计使用原始套接字生成ICMP报文来进行活动主机的探测。设计的大体思想是把包类型设置为回送请求,将它发送给网络上的一个IP地址,如果这个IP地址已被占用,那么使用这个IP地址的主机上的TCP/IP软件就能够接收到这个ICMP回送请
5、求,并返回一个ICMP回送响应信息。由于接收到的回送响应ICMP包是封装在IP包内,就需要解析该IP包,从中找到ICMP数据信息。相反,如果这个IP地址没有人使用,那么发送的ICMP回送请求在设定的时延内就不可能得到响应。在初始化原始套接字后,程序就要开始在一个IP网段内寻找活动主机。由于在某网段内需要发现的主机很多,为提高效率,采用了多线程编程。主程序和子线程的流程图分别如(图四)和(图五)所示。5.程序流程图:NYNNYStart_IPEnd_IP?线程数目太多?创建一个进程并执行Start_IP+构造原始套接字,并初始化建立并初始化目的主机的Sockaddr_in数据结构dest起始IP
6、Start_IP终止IPEnd_IP_将Start_IP填入dest中开始结束还有线程在执行?44等待一定时间Y等待一定时间图四:主程序流程图NNNYYY开始结束填充ICMP数据报发送数据报接收数据报去掉IP头获取ICMP信息数据包太短?不是回送响应?ID不符合?输出数据报中的IP地址图五:子线程流程图6.程序清单:#pragma pack(4)#pragma comment(lib,WS2_32.LIB)#define WIN32_LEAN_AND_MEAN#include#include#include#include#include#include#include/头文件typedef
7、struct iphdr /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 s
8、truct 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 /缺省数据块长度#d
9、efine 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 sockRaw; /原始套接字struct
10、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=&ThreadNumCounter;/全局变量的申明void main(int argc,char *
11、argv)if(argc!=3) /判断格式是否正确cout输入格式错误:scanhost start_ip end_ipendl;return;if(WSAStartup(MAKEWORD(2,1),&wsaData)!=0)coutWSAStartup failed:GetLastError()endl;ExitProcess(STATUS_FAILED);/创建原始套接字sockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,WSA_FLAG_OVERLAPPED);if (sockRaw=INVALID_SOCKET)coutWSA
12、Socket() failed:WSAGetLastError()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 set recv timeou:WSAGetLastError()endl;ExitProcess(STATUS_FAILED);timeout=1000;bread=setsockopt(soc
13、kRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)&timeout,sizeof(timeout);if(bread=SOCKET_ERROR)coutfailed to set send timeout:WSAGetLastError()endl;ExitProcess(STATUS_FAILED);memset(&dest,0,sizeof(dest); /初始化dest结构unsigned long startIP,endIP; dest.sin_family=AF_INET;dest.sin_addr.s_addr=inet_addr(argv1); /填入开始搜索
14、IPstartIP=inet_addr(argv1);end.sin_family=AF_INET;end.sin_addr.s_addr=inet_addr(argv2);endIP=inet_addr(argv2); /填入结束搜索IP地址HANDLE hThread;while(htonl(startIP)ThreadNumLimit) /判断线程数目,如果太多,休眠Sleep(5000);continue;DWORD ThreadID;sockaddr_in * pIPAddrTemp=new(sockaddr_in);if(!pIPAddrTemp)coutmemory alloc
15、failedtype=ICMP_ECHO;/设置类型信息icmp_hdr-id=(USHORT)GetCurrentThreadId();/设置其ID号为当前线程ID号datapart=icmp_data+sizeof(IcmpHeader);/计算ICMP数据报的数据部分memset(datapart,A,datasize-sizeof(IcmpHeader);/填入数据/ICMP数据包的填充void decode_resp(char *buf,int bytes,struct sockaddr_in *from)IpHeader *iphdr;IcmpHeader *icmphdr;uns
16、igned 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+=*buffer+;size-=sizeof(USHORT);if(size)cksum+=*(UCHAR*)buffer;cksum=(cksum16)+(cks
17、um & 0xffff);cksum+=(cksum16);return (USHORT)(cksum);/效验和的计算DWORD WINAPI FindIP(LPVOID pIPAddrTemp)InterlockedIncrement(aa);/线程数目+1char icmp_dataMAX_PACKET;memset(icmp_data,0,MAX_PACKET);/数据报初始化int datasize=DEF_PACKET_SIZE;/数据报报文的缺省长度datasize+=sizeof(IcmpHeader);/加上icmp头部长度fill_icmp_data(icmp_data,d
18、atasize);/填充包(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(W
19、SAGetLastError()=WSAETIMEDOUT)couttimed outendl;coutsendto failed:WSAGetLastError()endl;ExitProcess(STATUS_FAILED);n=1;if (WSAGetLastError()=WSAETIMEDOUT)couttimed outendl;ExitProcess(STATUS_FAILED);n=1;if(bwrotedatasize)coutWrotebwrotebytesendl;ExitProcess(STATUS_FAILED);n=1;int bread=recvfrom(sock
20、Raw,recvbuf,MAX_PING_PACKET_SIZE,0,(struct sockaddr*)&from,&fromlen);/数据包的接收if(bread=SOCKET_ERROR)if (WSAGetLastError()=WSAETIMEDOUT)couttimed outendl;coutrecvfrom failed:WSAGetLastError()endl;ExitProcess(STATUS_FAILED);n=1;if(n=0)decode_resp(recvbuf,bread,&from);InterlockedDecrement(aa);return 0;7.
21、实验步骤及测试1. 建立工程sy42. 工程中添加文件名为“scanhost”的c+头文件3. 键入头文件scanhost.h文件的内容4. 工程中添加文件名为“sy4”的c+源文件5. 键入sy4.cpp源文件的内容6. 不断调试至程序正确7. 分别编译头文件和源文件8. 连接两个文件8. 在DOS下运行可执行文件“sy4.exe”在DOS环境下发命令如下:c:sy4debug sy4 172.16.201.11 172.16.201.18其中sy4.exe 是可执行文件。后面的两个参数表示起始和结束IP地址。程序执行后可从屏幕中看到所探测到的网段中活动主机的IP地址。运行结果:(测试了172.16.201.11到172.16.201.18网段,发现主机无误)8.总结:计算机网络是一门新兴的交叉学科,涉及计算机技术与通信技术两个学科。网络技术经过多年发展,已经形成比较完善的体系。而且,网络技术还在高速发展中,其应用广泛,知识更新飞快。对于设计这样一个发展迅速的领域来说,我们课
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年耐高温滤料项目提案报告模板
- 2025年地区事业单位教师招聘考试数学学科专业知识试卷(数学分析)
- 2025年茶艺师(初级)职业技能鉴定理论考试试卷(茶叶市场分析)
- 历史专业古代战争史研究练习题
- 2025年电子商务师(初级)职业技能鉴定试卷:电子商务数据分析报告撰写
- 2025年消防工程师消防设施设备选型与消防安全设施布置试题
- 2025年声乐演唱教师资质认证模拟试题
- 2025年文化旅游演艺项目策划运营:文化旅游演艺项目创新策划与市场拓展研究报告
- 汽车行业供应链韧性优化与风险管理创新路径报告
- 深度挖掘2025年K2教育人工智能个性化学习系统应用效果与挑战
- 大健康产业商业计划书
- GB∕T 7528-2019 橡胶和塑料软管及软管组合件 术语
- 常州市机械行业安管考试题库
- 门店日常卫生检查表
- FANUC机器人R-2000iA机械单元维护手册
- 槽边排风罩的设计计算
- 中国当代文学专题-国家开放大学2022年1月期末考试复习资料-汉语言本科复习资料
- 机动车维修经营备案表
- 超星尔雅学习通《国际金融》2020章节测试含答案(上)
- 危险性较大的分部分项工程清单
- 城市设计导则案例
评论
0/150
提交评论