ping程序设计Word格式.docx
- 文档编号:22470978
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:14
- 大小:82.84KB
ping程序设计Word格式.docx
《ping程序设计Word格式.docx》由会员分享,可在线阅读,更多相关《ping程序设计Word格式.docx(14页珍藏版)》请在冰豆网上搜索。
选择开发环境,编译源程序;
给出软件测试文档、设计小结、参考文献。
2)课程设计(实践)报告编写要求
理论设计部分以课程设计论文的形式提交,格式必须按照课程设计论文标准格式进行
书写和装订。
课程设计报告(论文)包括目录、绪论、正文、设计小结等
3)参考文献:
(1)CCNA学习指南电子工业出版社
(2)http:
//www.huawei-
(3)
4)课程设计(实践)进度安排
1.准备阶段(4学时):
选择设计题目、了解设计目的要求、查阅相关理论资料
2.设计实践阶段(4学时):
设计方案选型
3.撰写课程设计论文阶段(4学时):
总结课程设计任务和设计步骤,撰写课程设计论文
学生签名:
(手写)
2011年5月30日
课程设计(论文)评审意见
(1)考勤与学习态度(20分):
优( )、良( )、中( )、一般( )、差( );
(2)理论理解与课程设计报告论文(40分):
(3)设计步骤规范程度 (20分):
(4)设计论文答辩 (20分):
(5)格式规范性及考勤是否降等级:
是( )、否( )
评阅人:
职称:
讲师
2011年6月6日
目录
一、TCP/IP网络编程技术简介
二、Ping程序原理
三、Ping程序设计(含流程图、源码)
四、Ping程序测试
五、Ping程序运行结果
六、设计小结
七、参考文献
1TCP/IP网络编程技术简介
网络编程的目的就是指直接或间接地通过网络协议与其他计算机进行通讯。
网络编程中有两个主要的问题,一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输。
在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上的一台主机。
而TCP层则提供面向应用的可靠的或非可靠的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层是如何处理数据的。
2ping程序原理
Ping程序的实现方法是:
主机向远程计算机发出ICMP回应请求以后,远程计算机会处理这个请求,然后生成一条回应应答消息,再通过网络传回给发送主机;
假如由于某些原因不能抵达目标主机,就会生成对应的ICMP错误消息由那个路径上某处的一个路由器返回.如果是与远程主机的连接没问题,只是远程主机已经关机,便需要由自己的程序来执行超时检查.
3ping程序设计
用AppWizard从VC++中生成一个基于对话框的工程MyPing,将Ping服务封装成一个类Cping,Ping的头文件中包括了ICMP包数据结构常量定义,ICMP及IP的头结构定义,完成了CPing类后还要把这个类用到对话框架中,所以在程序最后还要对界面的ping按钮功能关联到Cping类的函数中,用了一个Onping的函数,这里不作介绍.接下来介绍类Cping的代码:
classCPing
{
public:
voidSetConfigure(char*host,BOOLrecordrout=FALSE,intsize=DEF_PACKET_SIZE);
//设置ping参数
voidDecodeIPOptions(char*buf,intbytes);
//解析IP可选参数
voidCleanup();
//清除Socket,ICMP包数据及接收数据缓冲区
voidPing(inttimeout=1000);
//发送ICMP数据报
SOCKETm_hSocket;
//发送ICMP包的socket
IpOptionHeaderm_ipopt;
//IP头可选项
SOCKADDR_INm_addrDest;
//目的地址
SOCKADDR_INm_addrFrom;
//源地址
char*icmp_data;
char*recvbuf;
USHORTseq_no;
char*lpdest;
intdatasize;
BOOLm_bRecordRout;
CMyPingDlg*m_dlg;
CPing(CMyPingDlg*dlg);
////MFC的函数
virtual~CPing();
//析构函数
private:
voidDecodeICMPHeader(char*buf,intbytes,SOCKADDR_IN*from);
//解析ICMP头
USHORTchecksum(USHORT*buffer,intsize);
//ICMP数据校验
voidFillICMPData(char*icmp_data,intdatasize);
//填充ICMP数据
};
接下来介绍Ping.cpp中的部分代码.
首先是CPing的构造函数代码,如下所示:
CPing:
:
CPing(CMyPingDlg*dlg)//初始化
m_dlg=dlg;
icmp_data=NULL;
//初始化ICMP包
seq_no=0;
recvbuf=NULL;
lpdest=NULL;
datasize=DEF_PACKET_SIZE;
//结束
WSADATAwsaData;
//初始化socket
if(WSAStartup(MAKEWORD(2,2),&
wsaData)!
=0)//函数WSAStartup()初始化
//WindowsSocketsDLL
{
AfxMessageBox("
Sorry,youcannotloadsocketdll!
"
);
return;
}
m_hSocket=INVALID_SOCKET;
}
析构函数:
~CPing()
if(lpdest)
delete[]lpdest;
发送ICMP数据报的函数Ping():
首先建立一个Socket,指明地址族,类型以及所使用的特定协议,并把它设置Socket的ICMP包头结构选项,接着设置Socket的接受和发送超时选项.如果用户输入Ping的字符串是主机名,则将这个主机名解析成IP地址.然后创建一个ICMP包,在一个循环中不断地发送和接收ICMP包,当发送完4个后退出,最后解析返回的ICMP包头信息并显示Ping的最终结果,详细代码如下:
voidCPing:
Ping(inttimeout)
{
m_hSocket=WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,
WSA_FLAG_OVERLAPPED);
//此函数用于创建一个与指定传送服务提供者捆绑的socket
if(m_hSocket==INVALID_SOCKET)
AfxMessageBox("
socket创建失败!
return;
设置发送/接收超时选项:
intbread=setsockopt(m_hSocket,SOL_SOCKET,SO_RCVTIMEO,(char*)&
timeout,sizeof(timeout));
if(bread==SOCKET_ERROR)
设置socket接收超时选项错误!
timeout=1000;
bread=setsockopt(m_hSocket,SOL_SOCKET,SO_SNDTIMEO,
(char*)&
if(bread==SOCKET_ERROR)
设置socket发送超时选项错误!
memset(&
m_addrDest,0,sizeof(m_addrDest));
m_addrDest.sin_family=AF_INET;
//如有可能,解析输入的主机名
if((m_addrDest.sin_addr.s_addr=inet_addr(lpdest))==INADDR_NONE)//返回的地址不可用
{
structhostent*hp=NULL;
if((hp=gethostbyname(lpdest))!
=NULL)
memcpy(&
(m_addrDest.sin_addr),hp->
h_addr,hp->
h_length);
//由hp->
h_addr所指内存区域复制hp->
h_length个字节到指针所指内存区域。
m_addrDest.sin_family=hp->
h_addrtype;
else
AfxMessageBox("
输入的主机不存在!
}
//创建ICMP包
datasize+=sizeof(IcmpHeader);
icmp_data=(char*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,
MAX_PACKET);
//HeapAlloc分配内存,GetProcessHeap获得调用进程的堆的一个句柄
recvbuf=(char*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,
if(!
icmp_data)
堆分配错误!
FillICMPData(icmp_data,datasize);
//往ICMP包中填充数据
intnCount=0;
//开始发送和接受ICMP包
while
(1)
{
intbwrote;
if(nCount++==4)
break;
((IcmpHeader*)icmp_data)->
i_cksum=0;
timestamp=GetTickCount();
i_seq=seq_no++;
i_cksum=checksum((USHORT*)icmp_data,datasize);
bwrote=sendto(m_hSocket,icmp_data,datasize,0,
(structsockaddr*)&
m_addrDest,sizeof(m_addrDest));
if(bwrote==SOCKET_ERROR)
if(WSAGetLastError()==WSAETIMEDOUT)
m_dlg->
m_result+="
Timedout!
\r\n"
;
m_dlg->
SetDlgItemText(IDC_EDIT2,m_dlg->
m_result);
continue;
AfxMessageBox("
发送数据函数调用错误!
if(bwrote<
datasize)
CStringtemp;
temp.Format("
Wrote%dbytes\r\n"
bwrote);
m_dlg->
m_result+=temp;
intfromlen=sizeof(m_addrFrom);
bread=recvfrom(m_hSocket,recvbuf,MAX_PACKET,0,
m_addrFrom,&
fromlen);
//接收并读ICMP包
if(bread==SOCKET_ERROR)
\r\n"
接收数据函数调用错误!
DecodeICMPHeader(recvbuf,bread,&
m_addrFrom);
//解析ICMP头并显示结果
在ping程序里主要按照下面流程图实现:
5ping程序运行结果
程序完成后,运行就回出现一个PING程序的界面,在ping(里面输入IP地址或主机名,然后按PING键就可以出现下图的结果:
上图表示对地址192.168.1.106可达。
从序列号可知返回4次响应,还有显示数据来回所用的时间,以判断主机离我们有“多远”。
有ip头(没选项):
20bytes加icmp头:
12bytes再加定义的数据部分:
32bytes,就可得出一整个数据包的大小为64bytes。
发送和接受的数据包大小都是64bytes。
如果数据发送的目标不存在或者由于某些原因数据在规定时间没收到,显示端口就会出现超时的结果。
如下图就是目标主机不存在的结果:
6设计小结
本次课程设计用MFC来实现,这里简单介绍一下WINDOWSsocket机制:
在Windows下的各种网络编程接口中,套接字(SOCKETS)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。
可以将套接字看作不同主机间的进程进行双向通信的端点,它构成了单个主机内及整个网络间的编程界面。
套接字存在于通信域中,通信域是为了处理一般的线程通过套接字通信而引进的一种抽象概念。
套接字通常和同一个域中的套接字交换数据。
头文件WINSOCK.H是Windowssockets最重要的头文件,包括Windowssockets实现所定义的宏,常数值,数据结构和函数调用接口原型.
在实现程序时,首先在类里面声明函数和IP头和ICMP头的结构(ICMP包用回显请求和回显应答报文),还要包含一个#include<
winsock2.h>
的头文件,因为在这个头文件里面包含了我们要用的socket数据库函数。
上面所介绍的Ping程序主要是主机向远程计算机发出ICMP回显请求之后,远程计算机拦截这个请求,然后生成一条回显应答消息,通过网络传回给主机。
如果不能到达目的主机,就会生成对应的ICMP错误消息返回给源主机。
这次课程设计令我掌握基于TCP/IP网络编程的基本方法和思路,同时进一步熟悉《计算机网络》课程中基于IP层协议的工作机制。
因为课程设计跟考试混到一起,所以做得不是很好,还有上网找资料,找同学请教,不过这次实验我也学到很多,体会到编程功能的强大.
参考文献示例
[1]刘哓辉.网络硬件搭建与配置实践(第二版)[M].电子工业出版社.2009.1
[2]陈良宽,《计算机网络与建筑智能化系统集成》,中国建筑工业出版社,2003年3月
[3]胡道元,《智能建筑计算机网络工程》,清华大学出版社,2004年7月
[4]蒋先华、许以臣,《校园网络组建与应用》,科学出版社,2003年6月
[5][美]MatthewH.Birkner(潇湘工作室译),《Cisco互联网络设计》,人民邮电出版社
[6]2002年第一版
[7]李建民,《网络设计基础》,北京希望电子出版社,2000年第一版
[8]胡远萍、张治元,《计算机组网技术》,高等教育出版社,2003年6月
[9]
校园网络解决方案
[10]
思科产品的参数介绍
[11]
论校园网络规划设计的若干问题
[12]
组网技术解决向导
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ping 程序设计