ping网络课程设计
Ping程序设计与实现
课 程 设 计
课程名称 计算机网络 题目名称 Ping程序设计与实现___ 学生学院 计算机_________ 专业班级 08软件工程3班 _ 学 号 3108006938 学生姓名 林培育 指导教师 何翠红_ ____
2011年 7 月 4 日
1
Ping程序设计与实现
2
Ping程序设计与实现
Ping程序设计与实现
一、 实验设计目的与要求
1.1设计目的
PING程序是我们使用的比较多的用于测试网络连通性的程序。PING程序基于ICMP,使用ICMP的回送请求和回送应答来工作。由计算机网络课程知道,ICMP是基于IP的一个协议,ICMP包通过IP的封装之后传递。
设计目的是希望通过PING程序的设计,能初步掌握TCP/IP网络协议的基本实现
方法
快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载
,对网络的实现机制有进一步的认识。
1.2设计要求
已知目的节点IP地址或主机名,根据给出的目的节点IP地址或主机名进行ping测试。
二、实验原理与设计
内容
财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容
2.1 设计思路
1)初始化Windows Sockets网络环境;
2)解析命令行参数,构造目的端socket地址;
3)定义IP、ICMP报文;
4)接收ICMP差错报文并进行解析。
运行平台:Windows XP
设计软件:Visual C+= 6.0
2.2 ping工作原理
pi PING 程序是用来探测主机到主机之间是否可通信,如果不能ping到某台主机,表明不能和这台主机建立连接。ping 使用的是ICMP协议,它发送ICMP回送请求消息给目的主机。ICMP协议规定:目的主机必须返回ICMP回送应答消息给源主机。如果源主机在一定时间内收到应答,则认为主机可达。
ICMP协议通过IP协议发送的,IP协议是一种无连接的,不可靠的数据包协议。因此,保证数据送达的工作应该由其他的模块来完成。其中一个重要的模块就是ICMP(网络控制报文)协议。
当传送IP数据包发生错误,,比如主机不可达,路由不可达等等,ICMP协议将会把错误信息封包,然后传送回给主机。给主机一个处理错误的机会,这也就是为什么说建立在IP层以上的协议是可能做到安全的原因。ICMP数据包由8bit的错误类型和8bit的代码和16bit的校验和组成。而前 16bit就组成了ICMP所要传递的信息。
3
Ping程序设计与实现
PING利用ICMP协议包来侦测另一个主机是否可达。原理是用类型码为0的ICMP发请求,受到请求的主机则用类型码为8的ICMP回应。ping程序来计算间隔时间,并计算有多少个包被送达。用户就可以判断网络大致的情况。
Windows Sockets规范以U.C. Berkeley大学BSD UNIX中流行的Socket接口为范例定义了一套Micorosoft Windows下网络编程接口。它不仅包含了人们所熟悉的Berkeley Socket风格的库函数;也包含了一组针对Windows的扩展库函数,以使程序员能充分地利用Windows消息驱动机制进行编程。
Windows Sockets规
范本
协议范本下载族谱范本下载临帖范本下载公司章程范本下载监理月检范本下载
意在于提供给应用程序开发者一套简单的API,并让各家网络软件供应商共同遵守。此外,在一个特定版本Windows的基础上,Windows Sockets也定义了一个二进制接口(ABI),以此来保证应用Windows Sockets API的应用程序能够在任何网络软件供应商的符合Windows Sockets协议的实现上工作。因此这份规范定义了应用程序开发者能够使用,并且网络软件供应商能够实现的一套库函数调用和相关语义。
任何能够与Windows Sockets兼容实现协同工作的应用程序就被认为是具有Windows Sockets接口。我们称这种应用程序为Windows Sockets应用程序。
Windows Sockets规范定义并记录了如何使用API与Internet协议族(IPS,通常我们指的是TCP/IP)连接,尤其要指出的是所有的Windows Sockets实现都支持流套接口和数据报套接口.
应用程序调用Windows Sockets的API实现相互之间的通讯。Windows Sockets又利用下层的网络通讯协议功能和操作系统调用实现实际的通讯工作。
2.3 Ping 流程图
4
Ping程序设计与实现
开始
定义及初始化各个全局变量
判断函数是否调用成功 否
输出调用失败 是
创建套接字以及设置socket接收
超时,发送超时选项;
输入PING的IP地址
解析输入内容,设置PING参数
创建及填充ICMP数据报文
判断是否已发
送四次
是 否
Break; 发送,接收以及解析数据包 清除残余 输出PIING结果 结束
5
Ping程序设计与实现
三、详细设计
3.1 程序实现
ping程序使用以下数据:
IP报头长度IHL(Internet Header Length)――以,字节为一个单位来记录 IP报头的长度,是上述IP数据结构的ip_hl变量。
生存时间TTL(Time To Live)――以秒为单位,指出IP数据报能在网络上 停留的最长时间,其值由发送方设定,并在经过路由的每一个节点时减一,当该值为,时,数据报将被丢弃,是上述IP数据结构的ip_ttl变量
ICMP报头格式
ICMP报文分为两种,一是错误
报告
软件系统测试报告下载sgs报告如何下载关于路面塌陷情况报告535n,sgs报告怎么下载竣工报告下载
报文,二是查询报文。每个ICMP报头 均包含类型、编码和校验和这三项内容,长度为,位,,位和,,位,其余选项则随ICMP的功能不同而不同。
校验和算法――这一算法称为网际校验和算法,把被校验的数据,,位进行累加,然后取反码,若数据字节长度为奇数,则数据尾部补一个字节的,以凑成偶数。此算法适用于IPv4、ICMPv4、IGMPV4、ICMPv6、UDP和TCP校验和,更详细的信息请参考RFC1071。
标识符――用于唯一标识ICMP报文。
顺序号――代表ICMP报文的发送顺序。
3.2 定义IP、ICMP协议
1) /定义IP报头
typedef struct tag_ip_header{
unsigned char ver_ihl; //unsigned char 8位 版本(4位),头长(4位)
unsigned char tos; //TOS 服务类型
unsigned short tlen; //包总长unsigned short占两个字节
unsigned short identification;//标识
unsigned short flags_fo; //标志位Flags(3位)+分段偏移(13位)
unsigned char ttl; //TTL
unsigned char proto; //Protocol
unsigned short crc; //校验和
unsigned long saddr; //源地址
unsigned long daddr; //目的地址
unsigned int op_pad; //选项+填充字段u_int占4个字节32位
}IP_HEADER,*PIP_HEADER;
2)// 定义ICMP报头
typedef struct _ICMP_HEADER {
BYTE bType ; // 类型
BYTE bCode ; // 代码
USHORT nCheckSum ; // 校验和
6
Ping程序设计与实现
USHORT nId ; // 标识,本进程ID
USHORT nSequence ; // 序列号
UINT nTimeStamp ; // 可选项,这里为时间,用于计算时间
} ICMP_HEADER, *PICMP_HEADER ;
四、主要代码设计
1) // 初始化WinSock库
WORD wVersionRequested = MAKEWORD(2,2);
WSADATA wsaData;
if (WSAStartup(wVersionRequested, &wsaData)!=0)
return FALSE ;
2) // 创建原始套接字
SOCKET RawSock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
if (RawSock==INVALID_SOCKET)
{
m_output = m_output + "Create socket error!\r\n";
UpdateData(FALSE);
return FALSE ;
}
3) // 设置目标地址
SOCKADDR_IN DestSockAddr;
struct hostent *pHost;
if((pHost=gethostbyname(lpDestIp))==NULL) //获取主机IP地址
{
m_output = m_output + "An error occured when getting the IP
address.....\r\n";
UpdateData(FALSE);
WSACleanup();
return -1;
}
DestSockAddr.sin_family = AF_INET;
DestSockAddr.sin_addr=*(struct in_addr *)pHost->h_addr_list[0];
DestSockAddr.sin_port = htons (0);
4) // 创建ICMP回显请求包
char ICMPPack[ICMP_PACK_SIZE] = {0} ;
PICMP_HEADER pICMPHeader = (PICMP_HEADER)ICMPPack;
pICMPHeader->bType = 8;
pICMPHeader->bCode = 0;
pICMPHeader->nId = (USHORT)::GetCurrentProcessId();
pICMPHeader->nCheckSum = 0;
pICMPHeader->nTimeStamp = 0;
7
Ping程序设计与实现
memset(&(ICMPPack[ICMP_HEADER_SIZE]), 'E', ICMP_DATA_SIZE );
5) // 发送ICMP数据包
int nRet = ::sendto(RawSock, ICMPPack, ICMP_PACK_SIZE, 0,
(SOCKADDR*)&DestSockAddr, sizeof(DestSockAddr));
if (nRet==SOCKET_ERROR )
{
m_output = m_output + "sendto error! Try again!\r\n";
UpdateData(FALSE);
return FALSE ;
}
6) // 接收ICMP响应
int nLen = sizeof(SourSockAddr) ;
nRet = ::recvfrom(RawSock, szRecvBuf, DEF_BUF_SIZE, 0, (SOCKADDR*)&SourSockAddr, &nLen);
if (nRet==SOCKET_ERROR )
{
if (::WSAGetLastError()==WSAETIMEDOUT)
{
m_output = m_output + "Request Timeout\r\n";
UpdateData(FALSE);
lost++;
continue;
}
else
{
m_output = m_output + "recvfrom error!\r\n";
UpdateData(FALSE);
lost = 0;
return FALSE ;
}
}
五、设计测试与
分析
定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析
运行界面如下:
默认ping www.baidu.com
1)Ping 的结果如下:
8
Ping程序设计与实现
2)ping www.baidu.com
9
Ping程序设计与实现
分析:目的地址为119.75.218.70;发送了4个分组,接收到4个分组,0丢失。往返时间最小值为31ms,最长时间为47ms,平均时间为39ms。服务器www.baidu.com正常工作。
DOS下ping www.baidu.com结果如下:
结论:两个结果相比较虽然有些误差,但在允许的范围内,因此此程序设计要求已经完成。
ping 119.75.218.78 3)ping 百度的IP地址
分析:目的地址为119.75.218.70;发送了4个分组,接收到4个分组,0丢失。往返时间最小值为31ms,最长时间为47ms,平均时间为42ms。服务器
10
Ping程序设计与实现
www.baidu.com正常工作。
结论:ping 119.75.218.78与ping www.baidu.com的结果在误差运行的情况下基本相同。
www.baidu123.com 3)ping
Timeout,请求超时4个报文的分组都丢失了,服务器www.baidu123.com可能没在工作。
4)ping无效IP地址;例如Ping 255.253.253.555
输出错误响应。
六、心得体会
通过设计程序,真正了解了ICMP的结构。编写过程中,一些基本的常见的
11
Ping程序设计与实现
函数不会应用,这使我发现自己知识的匮乏,在以后的学习过程中得要好好的努力,多阅读一些复杂的程序,了解一个基本的函数,算法和精良的编程思想,更要多动手写一些有一定难度的程序,我们不应该害怕写程序出错,应该大胆地写出自己的想法,出现错误去解决错误就能找出自己知识的漏洞和模糊点。我们还可以通过阅读别人错误的程序,试着帮别人查找错误,这样证书技能头脑中的规则还能发现一些初学者一番的错误,使自己少走弯路。
通过整个程序和编写文档过程,感觉自己的能力还远远没达到老师的要求的层面上,恐怕还要继续努力啊。
七、参考文献
1.《计算机网络(第五版)》 谢希仁 主编 电子工业出版社
Visual C++ 通信编程工程实例精解》 胡志坤 主编 机械工业出版社 2.《
12