发现网络中的主机课设Word下载.docx

上传人:b****1 文档编号:15310249 上传时间:2022-10-29 格式:DOCX 页数:23 大小:105.71KB
下载 相关 举报
发现网络中的主机课设Word下载.docx_第1页
第1页 / 共23页
发现网络中的主机课设Word下载.docx_第2页
第2页 / 共23页
发现网络中的主机课设Word下载.docx_第3页
第3页 / 共23页
发现网络中的主机课设Word下载.docx_第4页
第4页 / 共23页
发现网络中的主机课设Word下载.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

发现网络中的主机课设Word下载.docx

《发现网络中的主机课设Word下载.docx》由会员分享,可在线阅读,更多相关《发现网络中的主机课设Word下载.docx(23页珍藏版)》请在冰豆网上搜索。

发现网络中的主机课设Word下载.docx

陈璞专业班级:

软件1001

指导教师:

刘东飞工作单位:

计算机学院

题目五:

发现网络中的主机

初始条件:

(1)学习相关知识

(2)C/C++/VC/VB/JAVA语言

(3)PC机一台

要求完成的主要任务:

(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)

编写程序,其功能是发送ICMP数据包,以获取指定网段中的活动主机,并将结果显示在标准输出上。

程序具体要求如下:

1)用命令行形式运行:

scanhostStart_IPEnd_IP

其中scanhost为程序名,Start_IP为被搜索网段的开始IP地址,End_IP为被搜索网段的结束IP地址。

2)输出格式为:

活动主机1

活动主机2

..........

时间安排:

第一、二天:

查阅资料,学习算法

第三、四天:

编程调试

第五天:

书写报告

指导教师签名:

年月日

系主任(或责任教师)签名:

目录

一、设计目的与意义4

二、设计内容和要求4

三、设计相关技术4

四、设计相关过程7

4.1程序的大致思想7

4.2使用原始套接字7

4.3定义IP头部和ICMP头部的数据结构8

4.4填充并发送回送请求类型的ICMP报文9

4.5计算校验和9

4.6IP包的发送10

4.7解析数据包10

五、程序流程图11

5.1主程序流程图11

5.2子程序流程图12

六、程序运行结果与测试13

七、体会与总结13

八、参考文献14

附录14

程序代码清单14

一、设计目的与意义

IP协议的优点是简洁,但缺少差错控制和查询机制,而网际控制报文协议(ICMP)具有补充IP功能的作用。

在网络管理中,常常要确定当前网络中处于活动状态的主机,这时可以通过使用ICMP的回送和回送响应消息来完成这项工作。

本课程设计的目的是若一个机房的主机已经达到了一定数量,进行网络管理时,常常需要确定当前网络中处理活动状态的主机。

本设计的目标就是编制程序,利用ICMP数据包,发现指定网段中的活动主机。

通过课程设计,使学生更加熟悉ICMP报文的结构,对ICMP协议有更好的理解和认识

二、设计内容和要求

设计程序,其功能是发送ICMP数据包,以获取指定网段中的活动主机,并将结果显示在标准输出上。

程序的具体要求如下:

scanhostStart_IPEnd_IP

其中scanhost为程序名;

Start_IP为被搜索网段的开始IP地址;

End_IP为被搜索网段的结束IP地址。

活动主机2

活动主机3

……………

三、相关技术

编制程序前首先要对ICMP报文的格式有一定的了解,ICMP报文是在IP数据报内部传输的,其结构如下图【1】所示:

IP数据报

IP首部ICMP报文

图【1】

ICMP报文的格式如下图【2】所示:

(位)078151631

类型字段

代码字段

校验和字段

(不同类型和代码有不同内容)

图【2】ICMP报文格式

所有报文的前4个字节都是一样的,但是其它字节则互不相同。

其中类型字段可以有15个不同的值,以描述特定类型的ICMP报文,某些ICMP报文还使用代码字段的值来进一步描述不用的条件。

按验和字段为2字节,校验的范围是整个ICMP报文。

检验和是必须的,其计算方法与IP协议头部校验和的计算方法一样。

各种类型的ICMP报文如下图【3】所示(ICMP报文类型),不同类型由报文中的类型字段和代码字段来共同决定。

类型

代码

描述

回送响应(PING应答)

3

目的不可达

1

2

4

5

7

8

9

10

11

12

13

14

15

网络不可达

主机不可达

协议不可达

端口不可达

需要进行分片但设置了禁止分片比特

源主机选择路由失败

无法识别目的网络

无法识别目的主机

源主机被隔离

目的网络被禁止

目的主机被禁止

由于服务类型(TOS),网络不可达

由于服务类型(TOS),主机不可达

由于过滤,通信被强行禁止

主机越权

优先权终止生效

源端被关闭(基本流控制)

重定向

对网络重定向

对主机重定向

对服务类型和网络重定向

对服务类型和主机重定向

回送请求(PING请求)

路由通告

路由请求

超时

传输期间生存期减为0

数据报组装期间生存期减为0

参数问题

各种IP头部错误

缺少必须的选项

时间戳请求

时间戳应答

17

信息请求(已作废)

信息应答(已作废)

地址掩码请求

地址掩码应答

图【3】ICMP报文类型

本课程设计的目的是发现网络中的活动主机,使用ICMP的回送和回送响应消息发现网络中的活动主机,即Ping消息的请求和应答。

发送的ICMP的数据包类型设置为回送请求(类型号为8);

接收ICMP的数据包类型设计为回送应答(类型号为0)。

四、设计相关过程

4.1程序的大致思想

本程序使用原始套接字生成ICMP报文来进行活动主机的探查,这个程序使用的是回送请求与应答消息。

把ICMP的数据包类型设置为回送请求,将它发送给网络上的一个IP地址,如果这个IP地址已经被占用的话,那么使用位于这个IP地址的主机上的TCP/IP软件就能够接收到这个ICMP回送请求,从而返回一个ICMP回送响应(类型号为0)信息。

信息封装在一个IP包中,我们需要解析该IP包,从中找到ICMP数据信息。

相反,如果这个IP地址没有人使用,那幺发送的ICMP回送请求在设定的延时内就不可能得到响应。

在初始化原始套接字之后,本程序就要开始在一个IP网段内寻找活动主机。

因为要寻找的主机可能很多,为节省时间可以采用多线程编程。

下面接结合核心代码对程序的具体实现进行讲解,同时为使程序流程更加清晰,去掉了错误检查

4.2使用原始套接字

为了实现发送/监听ICMP报文,必须使用原始套接字。

在初始化原始套接字之后,本程序就要开始在一个IP网段内寻找活动主机。

创建原始套接字的代码如下:

SOCKETsockRaw;

sockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,WSA_FLAG_OVERLAPPED);

在WSASocket函数中,我们使用IPPROTO_ICMP表示接收ICMP数据包,为了使用发送超时设置(设置SO_RCVTIMEO或SO_SNDTIMEO),必须将标志位置为WSA_FLAG_OVERLAPPED。

然后调用setsockopt函数设置读取延迟。

inttimeout=1000;

setsockopt(sockRaw,SOL_SOCKET,SO_RCVTIMEO,(char*)&

timeout,sizeof(timeout));

setsockopt(sockRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)&

在setsockopt函数中,sockRaw是之前创建的原始套接字,设置SQL_SOCKET表明使用基本套接字处理ICMP报文。

设置SO_RCVTIMEO表示使用接收超时设置,SO_SNDTIMEO表示使用发送超时设置,在这里,超时时间均设置为1000ms。

4.3定义IP头部和ICMP头部的数据结构

由于socket发送/捕获的是IP包,因此要分别定义IP头部和ICMP头部的数据结构。

//IP报头的数据结构

typedefstructiphdr{

unsignedintheadlen:

4;

//IP头长度

unsignedintversion:

//IP版本号

unsignedchartos;

//服务类型

unsignedshorttotallen;

//IP包总长度

unsignedshortid;

//ID号

unsignedshortflag;

//标记

unsignedcharttl;

//生存时间

unsignedcharprot;

//协议(UDPTCP)

unsignedshortchecksum;

//校验和

unsignedintsourceIP;

//源IP

unsignedintdestIP;

//目的IP

}IpHeader;

/ICMP头部的数据结构

typedefstructicmphdr{

BYTEtype;

//ICMP类型码,回送请求的类型码为8

BYTEcode;

//字类型码,保存与特定ICMP报文类型相关的细节信息

USHORTchecksum;

USHORTid;

//ICMP报文ID号(一般用进程号作为ID)

USHORTseq;

//ICMP数据报的序列号

}IcmpHeader;

4.4填充并发送回送请求类型的ICMP报文

为了使收到数据包的目的主机发送响应,我们需要向目的主机发送回送请求类型ICMP报文。

因此ICMP报文的填充代码如下:

#defineICMP_ECHO8//请求回送

#defineDEF_PACKET_SIZE32//缺省数据报长度

#defineMAX_PACKET1024//最大数据块长度

charicmp_data[MAX_PACKET];

//ICMP数据报最大可能的长度

memset(icmp_data,0,MAX_PACKET);

//将数据报清空初始化

intdatasize=DEF_PACKET_SIZE;

//ICMP数据报报文体的缺省长度

datasize+=sizeof(IcmpHeader);

//再加上ICMP头部的长度

IcmpHeader*icmphdr;

char*datapart;

icmp_hdr=(IcmpHeader*)icmp_data;

icmp_hdr->

type=ICMP_ECHO;

//设置类型

id=(USHORT)GetCurrentThreadId();

//设置其ID为当前线程号

datapart=icmp_data+sizeof(IcmpHeader);

//计算ICMP数据报的数据部分

memset(datapart,‘A’,datasize-sizeof(IcmpHeader));

//填入数据

((IcmpHeader*)icmp_data)->

checksum=0;

//先将校验和置0

seq=0;

//序列号为0

((IcmpHeader*)icmp_dat

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

当前位置:首页 > 求职职场 > 面试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1