发现网络中的活动主机--计算机网络课程设计
计算机网络课程设计报告校园网网络构建方案设计和实现

计算机网络课程设计报告校园网网络构建方案设计和实现计算机网络课程设计报告一、引言随着信息技术的快速发展,计算机网络在当今社会中扮演着至关重要的角色。
在这样的背景下,我们进行了一次关于“校园网网络构建方案设计”的课程设计。
我们的目标是为一个虚构的大学设计并实现一个全面的校园网络方案,包括网络架构、硬件设备、软件系统以及安全措施。
二、网络架构设计我们将采用分层的网络架构,包括核心层、汇聚层和接入层。
核心层负责高速数据传输,连接各个汇聚层设备;汇聚层负责将接入层的数据汇总并传输至核心层;接入层负责连接用户设备,为用户提供网络接入。
具体来说,核心层将由两台高性能交换机组成,负责高速数据传输。
它们之间通过冗余线路进行连接,保证网络的高可用性。
汇聚层将由多台交换机和路由器组成,连接核心层和接入层。
每个汇聚层设备将负责一定区域内的数据汇总和路由。
接入层将由多台接入交换机和无线接入点组成,为用户设备提供网络接入。
三、硬件设备选择在核心层,我们将选择具有高性能和高速端口的光纤交换机,如Cisco 4000系列。
在汇聚层,我们将选择具有多层交换和路由功能的交换机,如Cisco 3000系列。
在接入层,我们将选择具有基本交换和无线接入功能的交换机和无线接入点,如Cisco 2000系列和Cisco AP 系列。
四、软件系统设计我们将采用思科的的网络操作系统,如Cisco IOS,来进行网络管理和配置。
系统将采用DHCP协议为用户分配IP地址,采用VLAN技术隔离不同部门之间的数据传输,采用NAT技术实现公网和私网之间的转换。
此外,我们还将配置基本的网络安全策略,如防火墙和入侵检测系统,以保护网络免受攻击。
五、网络安全设计为了保障网络安全,我们将采取以下措施:1、部署防火墙以过滤非法访问和恶意攻击。
2、使用入侵检测系统(IDS)实时监控网络流量,发现异常行为及时报警。
3、实施访问控制策略,限制用户对网络资源的访问权限。
发现网络中的活动主机

计算机网络课程设计报告题目: 发现网络中的活动主机专业班级: 计科10102班姓名: 朱林学号: 201017010227同组姓名:谭莫然、谭斌、李绥海目录1.设计目标: (3)2.设计功能: (3)3.设计原理: (3)4.设计方法: (4)5.程序流程图: (5)6.程序清单: (6)7.实验步骤及测试 (12)8.总结: (13)9.参考资料: (14)1.设计目标:现在一个机房的主机已经达到了一定数量,进行网络管理时,常常需要确定当前网络中处理活动状态的主机。
本设计的目标就是编制程序,利用ICMP 的回送请求和回送响应,来发现指定网段中的活动主机。
2.设计功能:用命令行形式运行:scanhost Start_IP End_IP ,来发现活动主机并显示。
(注: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)数据包接受到,说明主机是存活状态。
如果没有就可以初步判断主机没有在线或者使用了某些过滤设备过滤了ICMP 的REPLY 。
ICMP 全称Internet Control Message Protocol ,工作在OSI 的网络层。
它的中文名为因特网控制报文协议。
ICMP 报文要封装在IP 数据报内部才能传输。
其结构如(图一)所示。
ICMP 报文的格式如(图二)所示。
计算机网络课程设计

计算机网络课程设计一、课程设计目的计算机网络课程设计是计算机科学与技术专业实践环节之一,是学习完《计算机网络》课程后进行的一次全面的综合练习。
其目的在于加深对OSI七层模型、TCP/IP模型的各层功能和设计思想的理解,掌握组建计算机网络的基本技术,特别是网络规划、设计和IP地址的分配,提高学生的应用能力。
二、课程设计内容及要求1、规划、设计局域网拓扑图,划分子网,设计子网地址、掩码和网关,为每个子网中的计算机指定IP地址。
2、在计算机内安装网络接口卡,动手制作双绞线网线,把计算机与集线器(交换机)相连,实现硬件上的连接。
3、给每台计算机安装含有网络内置功能的操作系统,如Windows2000Server、Unix、或Windows98等,安装TCP/IP协议,配置IP地址、掩码和网关等参数。
4、创建一个简单的WEB服务器,并制作一些网页,放入WEB服务器内。
5、创建局域网内的DNS服务器,配置相关文件,可以对局域网内的主机作域名解析。
6、创建局域网内的DHCP服务器,配置相关文件,可以对局域网内的机器作IP自动分配。
三、实验过程:1、1)计算机IP地址分配、掩码和网关局域网的IP地址有动态和静态两种类型。
选中TCP/IP选项,再单击【属性】按钮,在如图3-3的【TCP/IP属性】窗口中,先单击【IP地址】标签,我们来配置本机的IP地址和子网掩码(每个正式入网的用户都事先被分配给了一个合法IP地址,不同的用户拥有各自不同的IP地址和相同的子网掩码,如有疑问请到网络中心用户服务部查询)。
2)IP、子网掩码本例中为:IP地址(I):210.34.128.211子网掩码(U):255.255.255.03)网关如果正式入网的用户事先被分配给了一个合法IP地址,那么同时也分配有固定的网关(路由器)地址。
例如,对应上面的IP地址,其网关地址为:210.34.128.1 (网络中心给定)用鼠标单击【网关】标签,在这里输入新增网关(210.34.128.1)的地址后,再单击【添加(A)】按钮把它添加到“已安装的网关(I):”中。
课程设计---活动主机扫描

课程设计(Ⅰ)报告(2011 / 2012 学年第二学期)题目:活动主机的检测专业计算机科学与技术学生姓名班级学号指导教师指导单位计算机学院计算机系统与网络教学中心日期2012.06.11-2012.06.22指导教师成绩评定表2题目一:活动主机的检测一、课题内容和要求1.设计内容:根据协议规定的ICMP数据包的标准格式,编写程序向指定网段中的目的主机发送ICMP数据包,并对目的主机返回的数据包进行解析,以发现那些处于活动状态的主机。
2.设计要求(1)将目的主机的状态显示在屏幕上,具体格式:开始主机扫描活动主机:xx.xx.xx.xx活动主机:xx.xx.xx.xx…(2)要求有良好的编程规范和注释,编程所使用的操作系统、语言和编译环境不限,但是需在课程设计报告文档中予以说明。
二、需求分析2.1 使用原始套接字,实现发送/监听ICMP报文2.2 由于socket发送/捕获的是IP包,因此要分别定义IP头部的数据结构和ICMP头部的数据结构。
IP头部的数据结构和ICMP头部的数据结构在概要设计中已有分析。
2.3填充并发送请求类型的ICMP报文, 填充ICMP报文后,应在ICMP报文之前加上IP报头并发送出去。
2.4解析数据包:如果所ping的目的主机存在,那么它会发出一个回送应答包。
这是一个IP包,受到后解析此数据包并获得其中的ICMP信息。
根据IP报头信息中的IP报头长度字段,就可以得到ICMP报文的真实地址。
ICMP数据包中的IP地址就是活动主机的IP。
三、概要设计3.1 设计原理3 34本程序使用的原始套接字生成ICMP 请求/应答报文来进行活动主机的探查。
这个程序使用的是回送请求和应答消息。
程序的大致思想是把ICMP 的数据报类型设置为回送请求,将它发送给网络上的一个IP 地址,如果这个IP 地址已经被占用的话,那么使用位于这个IP 地址的主机上的TCP/IP 软件就能接受到这个ICMP 回送请求,从而返回一个ICMP 回送请求(类型号为0)信息。
获取网络中主机实验报告

计算机网络课程设计报告班级:计科141班姓名:xx(20141514112)xx(20141514129)xx(20141514118)题目:发现网络中活动的主机指导教师:xx日期:2016年6月24日发现网络中活动的主机一、问题描述1.设计目的:对于计算机实验室人员以及对宿舍局域网进行网络管理时,常常需要确定当前网络中处于活动状态的主机。
Ping命令利用ICMP回射请求报文和回射应答报文来测试目标系统是否可达。2.设计要求:编制程序,其功能是利用Ping命令通过发送数据包并接收应答信息来检测两台计算机之间的网络是否连通,以获取指定网段中的活动主机,并将结果显示在标准输出上。
二、概要设计1.主流程图:2.子流程图:三、详细设计1、获取本机IP(IpAddress类)package zx.huoquwangluozhuji;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;/**** @获取本机IP**/public class IpAddress {public static String getIpAddress() {InputStreamReader isr = null;BufferedReader br = null;String system = System.getProperty("").toUpperCase();try {Process pro = null;if (system.indexOf("WINDOWS") > -1)pro = Runtime.getRuntime().exec("cmd.exe /c ipconfig /all");elseSystem.out.println("不是windows系统");if (pro != null) {isr = new InputStreamReader(pro.getInputStream());br = new BufferedReader(isr);String line = null;while ((line = br.readLine()) != null) {// System.out.println(line);if (line.indexOf("IP Address") > -1) {int beginIndex = stIndexOf(":") + 2;int endIndex = line.length();line = line.substring(beginIndex, endIndex);return line;} else if (line.indexOf("IPv4 地址") > -1) {int beginIndex = stIndexOf(":") + 2;int endIndex = line.length() - 5;line = line.substring(beginIndex, endIndex);return line;}}}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {try {if (br != null)br.close();if (isr != null)isr.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}return "err";}}2、获取活动的主机(GetActivetyName类)package zx.huoquwangluozhuji;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;/**** @获取网络中活动的主机**/public class GetActivityName extends Thread {private int startIP, endIP;private String IPHead;public GetActivityName(String IPHead, int startIP, int count) {// TODO Auto-generated constructor stubthis.IPHead = IPHead;this.startIP = startIP;this.endIP = startIP + count;}public void run() {for (int i = startIP; i <= endIP; i++) {if (i > 255)break;String ip = IPHead + "." + i;InputStreamReader isr = null;BufferedReader br = null;String system = System.getProperty("").toUpperCase();Process pro = null;try {pro = null;if (system.indexOf("WINDOWS") > -1) {pro = Runtime.getRuntime().exec("cmd.exe /c ping " + ip);} else {System.out.println("不是windows系统");}if (pro != null) {isr = new InputStreamReader(pro.getInputStream());br = new BufferedReader(isr);String line = null;while ((line = br.readLine()) != null) {if (line.indexOf("TTL") > 0) {System.out.println(ip + "在线");break;}if (line.indexOf("超时") > 0 || line.indexOf("无法") > 0) {break;}}}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {try {if (br != null)br.close();if (isr != null)isr.close();if (pro != null)pro.destroy();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}}3、开始(Start类)package zx.huoquwangluozhuji;public class Start {private static int COUNT = 3;public static void main(String[] args) {// TODO Auto-generated method stubString ip = IpAddress.getIpAddress();String[] temp = ip.split("\\.");new Start();System.out.println("----------该网络中活动的主机----------");for (int i = 1; i <= 255; i = i + COUNT) {ip = temp[0] + "." + temp[1] + "." + temp[2];new GetActivityName(ip, i, COUNT - 1).start();}}public Start() {// TODO Auto-generated constructor stubdoShutdownWork();}private void doShutdownWork() {Runtime runtime = Runtime.getRuntime();runtime.addShutdownHook(new Thread() {public void run() {System.out.println("------------结束------------");}});}}四、系统的运行结果(系统的使用方法介绍)1、运行要求:1)、系统环境操作系统WindowsXP或以上2)、软件环境 JDK 1.72、系统的使用方法:在同一局域网内,运行Start程序,就可以获取网络中正在活动的主机。
计算机网络课程设计实验报告--发现网络中活动的主机

计算机网络课程设计报告题目:发现网络中活动的主机一、问题描述(把你所选的题目及要求说一下)IP协议的优点是简洁,但缺少差错控制和查询机制,而网际控制报文协议(ICMP)具有补充IP功能的作用。
在网络管理中,常常要确定当前网络中处于活动状态的ip及主机名,这时可以通过使用ICMP的回送和回送响应消息来完成这项工作。
程序要求,发送ICMP数据包,获取指定网段中的活动ip及主机名,并将结果显示在输出窗口,并且将结果保存至ips_a1ive.txt里。
本课程设计的目的就是编制程序,利用ICMP数据包,发现指定网段中的活动ip 及主机名。
为了提高程序运行效率,使用了多线程进行操作。
二、概要设计(抽象数据类型定义)1、定义了3个类:ScanInternetFrame//程序主窗口ScanInternet //用于扫描某网段ScanThread //多线程进行判断活动的ip2、定义的一些关键变量:StringStrip1; 〃记录开始ipStringstrip2; 〃记录结束ipintip1=0; 〃记录ip地址的第一个字节intip2=0; 〃记录ip地址的第二个字节intip3=0; 〃记录ip地址的第三个字节intip4=0; 〃记录ip地址的第四个字节intipCoυnt=4; 〃每个线程扫描的ip个数SortedSet<String>ips=newTreeSet<String>()〃记录活动的ip三、详细设计(主要算法和函数间的调用关系)1、关键代码:Runtimeruntime=Runtime.getRuntimeO;Stringcmd二,,ping〃+ip;Processproc=runtime,exec(cmd);BufferedReadertheReader=new BufferedReader(newInputStreamReader(proc.get1nputStream()));将Ping过后的结果,BUfferedReader里,然后,进行判断theReader里的数据进行判断ip是否活动。
计算机网络课程设计(华电)

课程设计报告( 2012——2013 年度第2学期)名称:计算机网络课程设计题目:互联网模拟院系:计算机系班级:计科学号:学生姓名:华电老朱家指导教师:设计周数:1周成绩:日期:2014 年 6 月28 日《计算机网络》课程设计任务书一、目的与要求1.目的将网络基本原理及基本概念用于实际,将书本上抽象的概念与具体的实现技术结合起来,使学习深化,培养学生对基本原理的应用能力以及实际动手能力.2.要求独立完成课程设计题目以及课程设计报告。
报告应包括设计思路、网络拓扑图、开发中遇到的问题以及解决方法。
二、主要内容1.网络设备认知及基本配置操作(1)了解路由器、交换机等网络设备结构。
(2)完成以下实验,掌握路由器、交换机等的配置方法,理解相关网络协议。
①交换机的基本配置;②路由器的基本操作;③OSPF基本配置;④RIP v2配置;⑤静态路由配置;⑥跨交换机实现VLAN;⑦利用单臂路由实现VLAN间路由;⑧广域网协议的封装。
2.互联网的模拟(1)结合实验环境,提出模拟网络互联需求,设计并完成组网,要求尽最大可能利用实验资源。
①网络物理拓扑结构设计及IP地址分配;②网络逻辑拓扑结构设计;(2)网络设备配置实现按步骤(1)所设计的网络拓扑进行设备连接并配置。
配置内容包括路由选择协议OSPF配置,VLAN划分等,并进行测试。
3.基于模拟互联网的网络协议分析。
在上面设计并实现的网络环境下,完成如下协议分析:①以太网数据链路层帧格式分析;②网络层分片;ICMP协议分析;③ARP地址解析协议分析;④TCP传输控制协议分析;⑤FTP协议分析;HTTP协议分析。
三、进度计划四、设计成果要求1.网络配置拓扑图准确,配置结果测试成功;2.网络协议分析准确;2.课程设计报告格式规范,内容详实.五、考核方式考勤、验收和课程设计报告。
学生姓名:指导教师:2014年6月23日实验一网络设备认知及基本配置操作一、交换机的基本配置1、实验目的:掌握交换机命令行各种操作模式的区别,能够使用各种帮助信息,以及用命令进行基本的配置。
《计算机网络原理课程设计》教学大纲

《计算机网络原理课程设计》教学大纲一、课程的基本信息课程编号1500208810课程名称计算机网络原理课程类别必修适用专业网络工程、软件工程开课学期 3周数1周总学分 1先修课程计算机网络基础并修课程数据结构课程简介这是一门要求掌握计算机网络的基本概念、基本原理和基本方法。
建议教材《计算机网络》,谢希仁主编,电子工业出版社,2008年参考书《计算机网络》(第2版),吴功宜,清华大学出版社,2007年二、目的与要求本课程设计的是立足于课堂讲授的基本概念、技术和方法,通过实验,使学生能追踪网络技术最新发展,要求学生掌握网络技术的基本概念、基本原理和基本技术等知识,能够并能分析网络的性能以及发现网络中的问题。
本课程设计分为软件基本操作和网络分析两个阶段,共6个任务。
三、内容与时间安排1.常用网络命令的使用(0.5天)2.Wireshark软件的安装与使用(0.5天)3.考察802.3协议的操作和以太网帧格式(1天)4.利用分组嗅探器(ethereal)分析协议HTTP和DNS(2天)5.探究TCP(0.5天)6.IP路由实践与应用(0.5天)四、作业(报告)要求课程设计报告包括封面、课程设计内容、课程设计实验过程分析、课程设计总结(如有创新点,在该处说明)等。
五、考核方式课程设计结束时,要求学生提交课程设计报告。
六、成绩评定课程设计成绩分两部分,设计报告占80%,自主创新占20%。
七、必要的说明有关题目的选择,原则上为教师事先制订,但经过申请,在指导教师的严格审核之下,可以自行选取更有现实意义的题目,或者真实项目也可。
制订人:李相海审订人:齐立磊批准人:张晓民2012年7月26日《计算机网络原理课程设计》教学大纲一、课程的基本信息课程编号1506107180课程名称计算机网络原理课程类别必修适用专业网络工程、软件工程开课学期 4总学时48(理论学时:48;实验学时:0 )总学分 3先修课程计算机网络基础并修课程数据库原理及应用、计算机网络布线、PHP网站编程技术等课程简介这是一门要求掌握计算机网络的基本概念、基本原理和基本方法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机网络课程设计一、设计内容及设计要求1.1课程设计内容:利用ICMP数据包,通过使用ICMP的回送和回送响应消息来确定当前网络中处于活动状态的主机,即ping消息的请求和应答,将发送的ICMP的数据包类型设置为回送请求(类型号为8),并显示在标准输出上。
用命令行形式运行:scanhost Start_IP End_IP,其中scanhost 为程序名;Start_IP为被搜索网段的开始IP;End_IP为被搜索网段的结束IP地址。
1.2课程设计目的:IP协议的优点是简单,但缺少差错控制和查询机制,而网际控制报文协议(ICMP具有补充IP功能的作用。
在网络管理中,常常要确定当前网络在红处于活动状态的主机,这时可以通过ICMP的回送和回送响应消息来完成这项工作。
这课程设计的目的就是编制程序,利用ICMP数据包,发现网络中的活动主机,即ping消息的请求和应答。
通过课程设计,熟悉ICMP报文的结构,对ICMP协议有更好的理解和认识,培养综合运用网络知识解决实际问题能力。
1.3课程设计要求:设计程序,其功能是发送ICMP数据包,以获取指定望段中的活动主机,并将结果显示在标准输出设备上程序的具体要求如下:1.用命令形式运行scanhost为程序名;start_ip为被搜索网段;end_ip为被搜索网段的结束IP地址。
如在命令行输入scanhost 192.168.0.1 192.168.0.1002.输出格式活动主机1的IP地址活动主机2的IP地址活动主机n的IP地址二、总体设计2.1设计原理首先对ICMP报文的格式有一定的了解,ICMP报文是在IP数据报内部传输的,其结构如图所示:ICMP报文的格式如图所示:0 7 8 15 16 31(位)所有报文的前4个字节都是一样的,但是其它字节则互不相同。
其中类型字段可以有15个不同的值,以描述特定类型的ICMP报文,某些ICMP报文还使用代码字段的值来进一步描述不用的条件。
按验和字段为2字节,校验的范围是整个ICMP报文。
检验和是必须的,其计算方法与IP协议头部校验和的计算方法一样。
各种类型的ICMP报文如图所示(ICMP报文类型),不同类型由报文中的类型字段和代码字段来共同决定。
课程设计的目的是发现网络中的活动主机,就是使用ICMP的回送和回送响应消息发现网络中的活动主机,即Ping消息的请求和应答。
那幺,发送的ICMP的数据包类型设置为回送请求(类型号为8)。
本程序使用的原始套接字生成ICMP请求/应答报文来进行活动主机的探查。
这个程序使用的是回送请求和应答消息。
程序的大致思想是把ICMP的数据报类型设置为回送请求,将它发送给网络上的一个IP地址,如果这个IP地址已经被占用的话,那么使用位于这个IP 地址的主机上的TCP/IP软件就能接受到这个ICMP回送请求,从而返回一个ICMP回送请求(类型号为0)信息。
信息封装在一个IP包中,我们需要解析该IP包,从中找到ICMP 数据信息,相反,如果这个IP地址没有人使用,那么发送的ICMP回送请求在设定的延时内就不可能得到响应。
2.2概要设计主程序流程图子线程流程图三、详细设计及代码3.1 ICMP报文分析ICMP是一种差错和控制报文协议,用于传输错误报告和控制信息。
ICMP报文分为头部和数据部分。
ICMP报文封装在IP数据报中传输。
IP报头中的类型为1时,表示报文的数据部分为ICMP报文。
虽然ICMP报文由IP报文传输,但是并不能认为ICMP是IP的上层协议,而是IP协议的有机补充。
把ICMP报文放在IP包中,是要利用IP的转发功能。
类型(TYPE)是一个字节,表示ICMP消息的类型。
代码(CODE)也是一个字节,表示报文类型的下一步信息。
校验和共有两个字节,提供对整个ICMP报文的校验和(和IP 报文类型的进一步信息)。
校验和共两个字节,提供对整个ICMP报文的校验和。
按照协议的功能来分,ICMP报文可以分为[1]. ICMP差错报文包括目的不可达报告,超时报告,参数出错报告。
[2] .ICMP控制报文包括拥塞控制和源抑制报文,路游控制和重定向报文[3] .ICMP测试报文包括请求应答报文,时戳请求应答报文。
本课程设计就是使用ICMP请求/应答报文来测试目的主机是否存在,请求者想某特定的主机发送请求,其中包含任选的数据。
目的主机收到请求后,发送应答报文。
在同一时刻,一台机器可以同时向多台主机发送请求报文。
ICMP报文格式如图所示:ICMP回送报文格式如下图所示:3.2程序功能分析本程序使用原始套接字生成ICMP报文来进行活动主机的探查。
这个程序使用的是回送请求与应答信息。
程序的大致思想是把ICMP的数据包类型设置为回送请求,将它发送给网络上的一个IP地址,如果这个IP地址已经被占用的话,那么使用位于这个IP地址的主机上的TCP/IP软件就能够接受到这个ICMP回送请求,从而返回一个ICMP回送响应(类型号为0)信息。
信息封装在一个IP包中,需要解析该IP包,从中找到ICMP数据信息。
相反,如果这个IP地址没有人使用,那么发送的ICMP回送请求在设定的延时内就不可能得到响应。
在初始化原始套接字之后,本程序就要开始在一个IP网段内寻找活动主机。
因为要寻找活动的主机可能很多,为节省时间可以采用多线程编程。
结合核心代码对程序的具体进行分析。
3.2.1使用原始套接字为了实现发送/监听ICMP抱文,必须使用原始套接字,创建原始套接字的代码如下:SOCKET sockraw;sockraw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,wsa_flag_overlapp ed);在WSASocket函数中,我们使用IPPROTO_ICMP表示接受ICMP数据包,为了使用发送接受超时设置(设置SO_RCVTIMEO或SO_SNDTIMEO),必须将标志位置为WSA_FLAG_OVERLAPPED。
然后调用setsockopt函数设置读取迟延。
在setsockopt函数中,sockraw是之前创建的原始套接字,设置SOL_SOCKET表明使用基本套接字处理ICMP抱文。
设置SO_RCVTIMEO表示使用接受超时设置,SOSNDTIMEO表示使用发送超时设置,在这里,超时时间均设置为1000ms。
3.2.2定义IP头部的数据结构typedef struct iphdr{unsigned int headlen:4; //ip头长度unsigned int wersion:4; //ip版本号unsigned char tos; //服务类型unsigned short totallen; //ip包总长度unsigned short id; //ip号unsigned short flag; //标记unsigned char ttl; //生存时间unsigned char prot; //协议(UDP TCP)unsigned short checksum; //校验和unsigned int sourceip; //源ipunsigned int destip; //目的ip}IpHeader;3.2.3定义ICMP头部数据结构typedef struct icmphdr{BYTE type; //icmp类型码,回送请求的类型码为8BYTE code; //子类型码,保存与特定ICMP报文类型相关的细节信息USHORT checksum; //校验和USHORT id; //ICMP报文id号USHORT seq; //ICMP数据报的序列号}Icmpheader;3.2.4填充并发送请求类型的ICMP报文#define ICMP_ECHO 8 //请求回送#define DEF_PACKET_SIZE 32 //缺省数据报长度#define MAX_PACKET 1024 //最大数据报长度#char icmp_data[MAX_PACKET]; //ICMP数据报最大可能长度Memset(icmp_data,0, MAX_PACKET) //将数据报清空初始化Int datasize=DEF_PACKET_SIZE; //ICMP数据报报文体的额缺省长度Datasize+=sizeof(icmpHeader);//加上ICMP数据头部icmp_header *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); //计算出ICMP数据报的数据部分memset(datapart,'A',datasize-sizeof(icmphearder)); //填入数据((IcmpHeader*)icmp_data)->seq=0; //序列号((IcmpHeader*)icmp_data)->check_sum=0; //先将检验和置0((IcmpHeader*)icmp_data)->checksum=checksum(USHORT*) icmp_data,data_size);Checksum 为计算校验和的函数,设校验和初值为0,然后对数据每16位求异或,结果取反,便得校验和。
其代码如下:USHORT checksum(USHORT * buffer, int size) //计算校验和{unsinged long cksum=0;while (size>1){cksum+=*buffer++;size-=sizeof(ushort);}if(size){cksum+=*(uchar)buffer;}cksum=(cksum>>16)+(cksum&0xffff);cksum+=(cksum>>16);return (ushort)(-cksum);}填充ICMP报文之后,应在ICMP报文之前加上IP报头并发送出去。
可调用下面的代码发送数据包。
注意,这里的dest是填入目的主机的IP地址的一个sockaddr_in数据结构,IP_STRING是目的的主机的IP地址字符串。
Struct sockaddr_in_dest;Dest.sin_family=AF_INET;Dest.sin_addr.s_addr=inet_addr(IP_STRING);Sendto(sockraw,icmp_data,datasize,0,(sockaddr*)&dest,size of(dest));3.2.5解析数据包如果所ping的目的主机存在,那么它会发出一个回送应答包。