1、一、实验目的和要求实验目的: PING程序是我们使用的比较多的用于测试网络连通性的程序。PING程序基于ICMP,使用ICMP的回送请求和回送应答来工作。由计算机网络课程知道,ICMP是基于IP的一个协议,ICMP包通过IP的封装之后传递。课程设计中选取PING程序的设计,其目的是希望同学们通过PING程序的设计,能初步掌握TCP/IP网络协议的基本实现方法,对网络的实现机制有进一步的认识。实验内容和要求:1、RAW模式的SOCKET编程PING程序是面向用户的应用程序,该程序使用ICMP的封装机制,通过IP协议来工作。为了实现直接对IP和ICMP包进行操作,实验中使用RAW模式的SOCKET
2、编程。熟悉SOCKET的编程,包括基本的系统调用如SOCKET、BIND等;2、具体内容1. 定义数据结构需要定义好IP数据报、ICMP包等相关的数据结构;2. 程序实现在WINDOWS环境下实现PING程序;3. 程序要求在命令提示符下输入: PING .其中为目的主机的IP地址,不要求支持域名,对是否带有开关变量也不做要求。不带开关变量时,要求返回4次响应。返回信息的格式: REPLY FROM .或 REQUEST TimeOut (无法PING通的情况)。二、实验环境Pc机一台(可以与其他机联通或者可以上网)操作系统为windows xp软件为vc6.0Windows 环境下三、实验方
3、法、步骤及结构测试实验按下述步骤进行:1) 熟悉IP以及ICMP协议的工作机制2) 熟悉RAW模式的SOCKET编程3) 编写PING的实现程序4) 编译环境中需要包括SOCKET库 WS2_32.lib5) 在模拟实现环境下调试并运行自己编写的PING程序6) 保留你实现的程序在你的用户目录下,以备辅导教师检查7) 最后提交源程序,撰写实验报告四、课程设计(论文)进程安排序号设计(论文)各阶段内容地点起止日期1了解实验内容,查找资料 实验室,图书馆12.222查找资料,了解各个函数的内容宿舍12.233调试,解决各段函数的错误,实现各项功能12.244小组交流,交换各自意见12.255答辩实
4、验室12.266完成设计报告,并加深对设计的了解12.27五、应收集的资料及主要参考文献1程良伦,网络工程概论,机械工业出版社,20072张越 等,Visual C+网络程序设计实例详解,人民邮电出版社,20063Andrew S Tanenbaum 著 潘爱民 译 ,计算机网络(第四版),清华大学出版社,20044谢希仁,计算机网络(第四版),电子工业大学,20065 王宏C编程设计方案教程清华大学出版社:2002:6 夏华香C#编程技巧具体案例解析中国电力出版社:2005:发出任务书日期:2008年 月 日 指导教师签名:计划完成日期: 2008年 月 日基层教学单位责任人签章:主管院长签
5、章:一、 ping的实现方法和方案: 1.1 ping的原理: Ping命令不仅存在Windows系统上,在Unix系统上也有Ping命令,其实对其他只要是支持网络的操作系统,一般也都存在该命令。Ping命令的主要作用是检测网络上主机的状态。要是在几年前,我们还可以下如此断言,如果不能Ping通某台主机,那么也就无法Telnet或者FTP到这台主机,但随着互联网的安全意识的增加,出现了访问控制清单的路由器和防火墙,由于ICMP报文是在IP数据包中被传输的,而到达一台主机不仅取决于IP层是否到达,还取决于使用何种协议和端口。譬如金山公司的金山网镖就可以禁止其他机器Ping通这台主机。所以在现在的
6、情况下,即时Ping不通某台机器,但也有可能FTP登陆到这台机器,或者通过HTTP来浏览这台机器上的Web页面 定义IP数据报、ICMP包等相关的数据结构如下: / IP 头结构typedef struct iphdr unsigned int h_len:4; / 首部长度 unsigned int version: / IP版本 unsigned char tos; / 服务类型 unsigned short total_len; / 包总长度 unsigned short ident; /标识符 unsigned short frag_and_flags; / 标志 unsigned c
7、har ttl;/ 生存周期 unsigned char proto; / protocol (TCP, UDP etc) 协议类型 unsigned short checksum; /IP检验和 unsigned int sourceIP;/源地址IP unsigned int destIP;/目的地址IPIpHeader;/ ICMP 头结构typedef struct icmphdr BYTE i_type;/类型 BYTE i_code; / 代码类型 USHORT i_cksum;/检验和 USHORT i_id;/地址 USHORT i_seq;/发送顺序 /* This is n
8、ot the std header, but we reserve space for time */ ULONG timestamp;/接受时间IcmpHeader;1.2设计方案:ping-n count -r count-n count 发送 count 指定的 ECHO 数据包数。默认值为 4。-r count 在记录路由字段中记录传出和返回数据包的路由。count 可以指定最少 1 台,最多 9 台计算机。Ping的返回信息有Request Timed Out、Destination Net Unreachable和Bad IP address还有Source quench rece
9、ived。这个信息表示对方主机可以到达到TIME OUT,这种情况通常是为对方拒绝接收你发给它的数据包造成数据包丢失。大多数的原因可能是对方装有防火墙或已下线。这个信息表示对方主机不存在或者没有跟对方建立连接。这里要说明一下destination host unreachabletime out的区别,如果所经过的路由器的路由表中具有到达目标的路由,而目标因为其它原因不可到达,这时候会出现,如果路由表中连到达目标的路由都没有,那就会出现 这个信息表示你可能没有连接到DNS服务器所以无法解析这个IP地址,也可能是IP地址不存在。信息比较特殊,它出现的机率很少。它表示对方或中途的服务器繁忙无法回应
10、。 开始结束iargc?if(*)switch()bRecordRoute=trueusage(*)datasize=atoi(argvi)ipdest=argvi1.3程序实现流程图如下: rdefault成立成立 否成立否否图(ValidateArgs)ptr/4?If(host)?Inaddr,h_nameinaddr成立不成立 成立Iphdrlen&!icmpcountDecodeIPoptions()bytesh_addr, hp-h_length);/创建首部长度的内存存储发送地址dest.sin_family = hp-h_addrtype;/设置系统主机系统套接字dest.si
11、n_addr = %sn, inet_ntoa(dest.sin_addr);/打印发送地址elsegethostbyname() failed:return -1;/ Create the ICMP packet/datasize += sizeof(IcmpHeader);icmp_data = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, MAX_PACKET); /为icmp_data分配内存recvbuf = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, MAX_PACKET); /为recv
12、buf分配内存if (!icmp_data)/判断分配内存是否成功HeapAlloc() failed:memset(icmp_data,0,MAX_PACKET);/把icmp_data内存清空FillICMPData(icmp_data,datasize);/调用函数填写ICMP包数据while(1)/用循环控制发送数量static int nCount = 0;/设置静态变量,记录发送报文的数量int bwrote;if (nCount+ = 4)/判断是否已经发送了4个报文,是的话退出整个循环break;(IcmpHeader*)icmp_data)-i_cksum = 0;/先把IC
13、MP的检验和置零timestamp = GetTickCount();/获取当前时间i_seq = seq_no+;/发送顺序加一i_cksum =checksum(USHORT*)icmp_data, datasize); /计算检验和bwrote = sendto(sockRaw, icmp_data, datasize, 0,(struct sockaddr*)&dest, sizeof(dest); 创建发送套接字if (bwrote = SOCKET_ERROR)/判断错误if (WSAGetLastError() = WSAETIMEDOUT)printf(timed outn);/判断超时错误continue;sendto() failed:/判断发送失败错误if (bwrote datasize)/比较发送数据报的大小Wrote %d bytesn, bwrote);/打印发送数据报的大小bread = recvfrom(sockRaw, recvbuf, MAX_PACKET, 0,(struct sockaddr*)&from, &fromlen); /创建接受套接字if (bread = SOCKET_ERROR)/判断失败原因/判断打印超时错误recvfrom() failed:/判断接收失败
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2