PING程序的设计-课程设计
1 ping设计任务目的及要求 5
1.1 设计目的 5
2 ping工作原理及设计
5
2.1 设计思路 5
2.3 设计流程图 6
2.4 设计方案 6
3 ping核心程序 7
4 ping实验结果 10
5 总结 11
一、 实验目的
PING程序是我们使用的比较多的用于测试网络连通性的程序。PING程序基于ICMP,使用ICMP的回送请求和回送应答来工作。由计算机网络课程知道,ICMP是基于IP的一个协议,ICMP包通过IP的封装之后传递。 课程设计中选取PING程序的设计,其目的是希望同学们通过PING程序的设计,能初步掌握TCP/IP网络协议的基本实现
,对网络的实现机制有进一步的认
识。
二、 实验内容和要求
1、RAW模式的SOCKET编程
PING程序是面向用户的应用程序,该程序使用ICMP的封装机制,通过IP协议来工作。为了实现直接对IP和ICMP包进行操作,实验中使用RAW模式的SOCKET编程。
熟悉SOCKET的编程,包括基本的系统调用如SOCKET、BIND等;
2、具体内容
1) 定义数据结构
需要定义好IP数据报、ICMP包等相关的数据结构; 2) 程序实现
在WINDOWS环境下实现PING程序;
3) 程序要求
在命令提示符下输入:
PING ΧΧΧ.ΧΧΧ.ΧΧΧ.ΧΧΧ 其中ΧΧΧ为目的主机的IP地址,不要求支持域名,对是否带有开关变量也不
做要求。不带开关变量时,要求返回4次响应。 返回信息的格式:
REPLY FROM ΧΧΧ.ΧΧΧ.ΧΧΧ.ΧΧΧ 或
REQUEST TimeOut (无法PING通的情况)。 三、 实验主要仪器设备和材料
联网计算机。
四、 实验方法、步骤及结构测试
实验按下述步骤进行:
1) 熟悉IP以及ICMP协议的工作机制
2) 熟悉RAW模式的SOCKET编程
3) 编写PING的实现程序
4) 编译环境中需要包括SOCKET库 WS2_32.lib
5) 在模拟实现环境下调试并运行自己编写的PING程序 6) 保留你实现的程序在你的用户目录下,以备辅导教师检查 7) 最后提交源程序,撰写实验报告
五、 课程设计进程安排
序号 设计各阶段内容 地点 起止日期
1 选择课程设计
目,分析题目要求及熟悉实验软件。 实验2号楼202 2008.12.22
2 查阅资料,提出设计方案并讨论。 图书馆 2008.12.23
3 进行编译并调试程序 实验2号楼202 2008.12.24
4 调试程序、改进 实验2号楼202 2008.12.25
5 检查 实验2号楼202 2008.12.26
六、 应收集的资料及主要参考文献
1. 程良伦主编,《网络工程概论》,机械工业出版社. 2007 2. 苏峰,黄金双,汤蕾编著,《Visual C++.NET编程实例》,清华大学出版社.2004 3. 黄嘉辉编著,《Internet与TCP/IP程序设计之C++ Builder高手》,清华大学出版社.2001
发出任务书日期: 2008年 12月 22日 指导教师签名:
完成日期: 2008年 12月 29日 基层教学单位责任人 签章:
主管院长签章:
1 ping设计任务目的及要求
1.1 设计目的
PING程序是我们使用的比较多的用于测试网络连通性的程序。PING程序基于ICMP,使用ICMP的回送请求和回送应答来工作。由计算机网络课程知道,ICMP是基于IP的一个协议,ICMP包通过IP的封装之后传递。 课程设计中选取PING程序的设计,其目的是希望同学们通过PING程序的设计,能初步掌握TCP/IP网络协议的基本实现方法,对网络的实现机制有进一步的认
识。
1.2 设计要求
1、RAW模式的SOCKET编程
PING程序是面向用户的应用程序,该程序使用ICMP的封装机制,通过IP协议来工作。为了实现直接对IP和ICMP包进行操作,实验中使用RAW模式的SOCKET编程。
熟悉SOCKET的编程,包括基本的系统调用如SOCKET、BIND等; 2、具体内容
1)定义数据结构
需要定义好IP数据报、ICMP包等相关的数据结构;
2)程序实现
在WINDOWS环境下实现PING程序;
3)程序要求
在命令提示符下输入:
PING ΧΧΧ.ΧΧΧ.ΧΧΧ.ΧΧΧ
其中ΧΧΧ为目的主机的IP地址,不要求支持域名,对是否带有开关变量也不
做要求。不带开关变量时,要求返回4次响应。
返回信息的格式:
REPLY FROM ΧΧΧ.ΧΧΧ.ΧΧΧ.ΧΧΧ
或
REQUEST TimeOut (无法PING通的情况)。
2 ping工作原理及设计方案
2.1 设计思路
由于PING是基于ICMP协议,因此需要使用windows socket中的RAW模式进行编程。首先要定义好IP数据包头,接着再IP数据包头的基础上定义ICPM数据包头,由于需要计算回送时间,因此还需要ICMP回送数据的结构。PING的具体实现流程可以分为以下几点:首先创建SOCKET,然后根据主机名查询主机地址,
输出主机地址;接着调用PING主程序对目标主机地址进行测试,测试过程包含
相关信息的处理;最后输出信息,并关闭SOCKET。
2.3 设计流程图
2.4 设计方案
IP头与ICMP头的设置分别参照RFC791及RFC792的
,包含所有必要信息。
ICMP回送数据结构增加了数据传输时间用于计算。主程序设置PING()函数,用于数据包发送及接收,其中,数据包发送(回送请求)调用另一函数
SendEchoRequest(),数据包接收(回送接收)调用RecvEchoReply()。由
于发送数据包时可能会遇到阻塞或者目标主机不通,造成超时,因此需要在发送
数据包后调用一个函数来判断是否超时,此处设置一个函数,WaitForEchoReply()来实现超时判断功能,该函数调用SOCKET的select()来进行判断。其次,还需要一个函数来计算CRC校验和,此处设置为in_cksum(),校验和采用移位的方法进行计算。另外设置一ReportError()函数来返回SOCKET操作相关的错误代码。
PING程序作为SOCKET的RAW方式下调用ICMP协议,数据包采用UDP发送,相应调用SOCKET的sendto()和recvfrom()进行发送及接收。334
PING程序的设计
ping核心程序
void Ping(LPCSTR pstrHost)
{
SOCKET rawSocket;
LPHOSTENT lpHost;
sockaddr_in saDest;
sockaddr_in saSrc;
DWORD dwTimeSent;
DWORD dwElapsed;
u_char cTTL;
int nLoop;
int nRet;
//创建一个原始套接口
rawSocket=socket(AF_INET,SOCK_RAW,IPPROTO_ICMP);
if(rawSocket==SOCKET_ERROR)
{
ReportError("socket()");
return;
}
//根据主机名查询主机地址
lpHost=gethostbyname(pstrHost);
if(lpHost==NULL)
{
fprintf(stderr,"\nHost not found:%s\n");
return;
}//设置目标套接口地址
saDest.sin_addr.s_addr=*((u_long FAR*)(lpHost->h_addr));
saDest.sin_family=AF_INET;
saDest.sin_port=0;
//输出Ping程序的提示信息
printf("\nPinging %s [%s] with %d bytes of data:\n",
pstrHost,inet_ntoa(saDest.sin_addr),REQ_DATASIZE);
//控制Ping执行的次数
for(nLoop=0;nLoop<4;nLoop++)
{
SendEchoRequest(rawSocket,&saDest);//使用select()等待接收回送的数
据
nRet=WaitForEchoReply(rawSocket);
if(nRet==SOCKET_ERROR)
{
ReportError("select()");
break;
}
if(!nRet)
{
printf("\nTimeOut");//输出超时提示
break;
}
//接收应答
dwTimeSent=RecvEchoReply(rawSocket,&saSrc,&cTTL);//计算传输时间
dwElapsed=GetTickCount()-dwTimeSent;
printf("\nReply from:%s:bytes=%d time =%ld ms TTL=%d",
inet_ntoa(saSrc.sin_addr),REQ_DATASIZE,dwElapsed,cTTL);
printf("\n");
}
nRet=closesocket(rawSocket);
if(nRet==SOCKET_ERROR)
{
ReportError("closesocket()");
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
int SendEchoRequest(SOCKET s,LPSOCKADDR_IN lpstToAddr)//给目标站点发送
回送请求 {
static ECHOREQUEST echoReq;
static lwfree.cn
int nRet;
//填写回送请求信息
echoReq.icmpHdr.Type=ICMP_ECHOREQ;
echoReq.icmpHdr.Code=0;
echoReq.icmpHdr.Checksum=0;
echoReq.icmpHdr.ID=nId++;
echoReq.icmpHdr.Seq=nSeq++;
//填写要发送的数据
for(nRet=0;nRet
1)
{
sum+=*w++;
nleft-=2;
}
if(nleft==1)
{
u_short u=0;
*(u_char*)(&u)=*(u_char*)w;
sum+=u;
}
sum=(sum>>16)+(sum&0xffff);
sum+=(sum>>16);
answer=~sum;
return(answer);
}
PING程序的设计|网络概论课程设计报告|报告
ping实验结果
在命令行输入如下信息,进行本机测试:
>Ping 127.0.0.1
输出结果为:
如果输入:
>Ping www.751com.cn
输出结果为:
如果输入:
>Ping 192.168.1.168
输出结果为:
5 总结
本次课程设计较好地实现了要求做到的功能,但同时也遇到了不少的困难和挑战。
通过这次设计,我不但加深了对SOCKET的原始套接字RAW编程的理解,同时也对IP和ICMP协议有了进一步的认识。这次设计的主要难点,在于数据包的发送
接收,TTL的计算,以及超时的判断。
通过这次课程设计,我了解到自己在ICMP协议方面还有很多不足,在完成实验的
过程中老师给了我很大的帮助和鼓励,使我能够很好的完成这次实验。 文献
1.程良伦主编,《网络工程概论》,机械工业出版社. 2007 2.苏峰,黄金双,汤蕾编著,《Visual C++.NET编程实例》,清华大学出版社.2004
3.黄嘉辉编著,《Internet与TCP/IP程序设计之C++ Builder高手》,清华大
学出版社.2001