c++实现ping功能

上传人:第*** 文档编号:32814990 上传时间:2018-02-12 格式:DOC 页数:19 大小:246.50KB
返回 下载 相关 举报
c++实现ping功能_第1页
第1页 / 共19页
c++实现ping功能_第2页
第2页 / 共19页
c++实现ping功能_第3页
第3页 / 共19页
c++实现ping功能_第4页
第4页 / 共19页
c++实现ping功能_第5页
第5页 / 共19页
点击查看更多>>
资源描述

《c++实现ping功能》由会员分享,可在线阅读,更多相关《c++实现ping功能(19页珍藏版)》请在金锄头文库上搜索。

1、综 合 课 程 设 计 报 告 第 1 页 共 19 页题目:VC+实现探测远程主机是否可达1 课程设计目的(1)了解探测远程主机是否可达的方法。(2)了解 windows网络编程的基本步骤。(3)了解 TCP/IP协议及 ICMP协议。(4)掌握 ping命令的思想。(5)掌握 Windows Socket API的使用方法。2 课程设计原理ICMP:互联网控制报文协议,提供一个特殊的报文在互联网的结点之间进行监测和控制,测试目的主机是否可达,与本次课程设计目的一致,因此可模拟 ICMP的工作方式来编制程序。首先通过生成一个 ICMP“回应请求” ,然后将其定向至打算查询的目标主机,远程主机

2、会拦截这个请求,然后生成一条回应答复消息,再通过网络回传给我们。若是不能抵达目标主机,则会生成相应的错误消息。具体步骤如下:1)创建类型为 SOCK_RAW的一个套接字,同时设定协议 IPPROTO_ICMP。2)创建并初始化 ICMP头。3)调用 sendto将 ICMP请求发给远程主机。4)调用 recvfrom以接收 ICMP响应。其流程图如下:综 合 课 程 设 计 报 告 第 2 页 共 19 页开始启动 W i n s o c k获取关键参数 : 目的主机地址创建套接字 , 协议字段 : I C M P设置发送和接收数据最长等待时间 t i m e o u t填写目的主机信息建立

3、I C M P 数据包i n t i = 0发送和接收数据包一次 , i + +i #include #pragma comment( lib, ws2_32.lib ) 综 合 课 程 设 计 报 告 第 3 页 共 19 页#define ICMP_ECHO 8 /回应请求类型的 ICMP消息类型#define ICMP_ECHOREPLY 0 /回应答复型的 ICMP消息类型#define ICMP_MIN 8 / ICMP数据报最小长度#define DEF_PACKET_SIZE 32 /默认数据报大小#define DEF_PACKET_NUMBER 4 /发送数据报的个数 #de

4、fine MAX_PACKET 1024 /最大 ICMP数据报大小char *Ipdest; /目标主机的 IP地址int datasize; /ICMP消息的长度/接收到的 ICMP消息数,每收到一条 ICMP消息就加 1static int icmpcount=0; /IP头(20 字节)struct IPHEAD unsigned int headlength:4; / 4位头长度unsigned int version:4; / 4位版本unsigned char tos; / 8位服务类型unsigned short totallength; / 16位总长 unsigned sh

5、ort ip_id; / 16位标识unsigned short frag_and_flags; /3个一位标识加分段偏移unsigned char ttl; /8位存活时间unsigned char protocal; /8位协议类型 unsigned short ip_checksum; /16位头校验和unsigned int sourceIP; /32位源 IP地址unsigned int destIP; /32位目标 IP地址; 综 合 课 程 设 计 报 告 第 4 页 共 19 页/ ICMP 头(12 字节)struct ICMPHEAD unsigned char type;

6、 /类型(0,8)unsigned char code; /代码(0)unsigned short icmp_checksum; /校验和unsigned short icmp_id; /标识符unsigned short seq; /序号unsigned long timestamp; /时间戳; /Fill_icmp_data函数:用于设置 ICMP头部,填充 ICMP消息void Fill_icmp_data(char * icmp_data, int datasize)ICMPHEAD *icmphead=NULL; char *datapart=NULL; icmphead = (I

7、CMPHEAD*)icmp_data; icmphead-type = ICMP_ECHO; /ICMP_ECHO=8icmphead-code = 0; /类型为 8,代码为 0,表示回应请求icmphead-icmp_checksum = 0;icmphead-icmp_id = (unsigned short)GetCurrentProcessId(); datapart = icmp_data + sizeof(ICMPHEAD);/具体内容的首地址指针/初始化数据包内容部分for(int i=0;iheadlength) * 4 ;/获取操作系统启动至今所经过的时间(ms)tick=

8、GetTickCount();if (bread sin_addr);couttype != ICMP_ECHOREPLY) couttype)icmp_id != (unsigned short)GetCurrentProcessId() coutsin_addr);couttimestampseq;cout1) cksum+=*buffer+; /求各个 16位数字之和size -=sizeof(unsigned short); 综 合 课 程 设 计 报 告 第 7 页 共 19 页 if(size) cksum += *(unsigned char*)buffer; cksum = (

9、cksum 16) + (cksum /高位与低位相加cksum += (cksum 16); /加上进位return (unsigned short)(cksum); /取反得到校验和 /Usage函数:表示程序的功能void Usage(char *progname)couth_addr,hp-h_length); /复制内存dest.sin_family=hp-h_addrtype;couticmp_checksum=0;(ICMPHEAD*)icmp_data)-timestamp = GetTickCount(); (ICMPHEAD*)icmp_data)-seq=seq+;(IC

10、MPHEAD*)icmp_data)-icmp_checksum = Checksum(unsigned short*)icmp_data,datasize);/发送数据bwrote = sendto(sockRaw,icmp_data,datasize,0,综 合 课 程 设 计 报 告 第 12 页 共 19 页(sockaddr*)if (bwrote = SOCKET_ERROR)if (WSAGetLastError() = WSAETIMEDOUT)cout=0&kk=a&kk=z) k=i;break;综 合 课 程 设 计 报 告 第 17 页 共 19 页continue;/

11、将目标地址赋给 dest数组:预先定义的字符串数组for(i=k;inputi!=0;i+)destl=inputi; l+;for(i=l;i79;i+)desti=0;Ipdest=dest; /Ipdest指向地址coutendl;42 运行结果将程序编译,组建,执行,然后从键盘上输入“ping”+目的地址。运行结果与从命令行输入目的地址一样。4.2.1 输入目标主机地址为“127.0.0.1”综 合 课 程 设 计 报 告 第 18 页 共 19 页“127.0.0.1”为本地的 Lookback地址,能够 ping通表明 TCP/IP协议没有问题。4.2.2 输入目标主机地址为域名地

12、址“”可见目标主机不可达。5 心得刚刚拿到课题时,我只能说知道其中的 ping怎么用。至于编程来实现它,则没什么头绪。课程设计的要求是采用 Windows Socket API的相关函数实现。但是对于Windows Socket API,我知之甚少。于是去图书馆借了好几本书,在网上下载了资料无数,开始了三周的编程生涯。过程中遇到过很多一开始看似不可克服的难题。网络编程中有各种现成的函数,只要包含相应的头文件和库都可以调用,但是对于不熟悉的人来说,其中的返回值和数据类型并不好掌握,当几个函数的返回值和参数类型在网络字节和点式地址之间变来变去的时候,除了觉得头晕还是觉得头晕。还有就是Windows

13、 Socket中容易出现各种错误,需要兼顾到还是有些繁琐的。在使用综 合 课 程 设 计 报 告 第 19 页 共 19 页带参数的主函数的问题上,我纠结了很久,但是还是没有弄懂,最后还是在众多网友的七嘴八舌中间找到了线索,终于得到了正确的结果。回顾这次课程设计,我感慨颇多。在这段时间内,需要经常对着电脑,经常是坐了半天也没有成果,可以说是苦多于甜,但是这不仅可以帮助我巩固曾经学习过的知识,而且让我增长了许多课本上学不到的和自己平时不注意积累的知识。在这个过程中,不仅我独立思考的能力得到了很大地提高,更重要的是我学到了更多学习的方法,这是日后最实用的,真的让我受益匪浅。同时我也感觉到查阅资料的

14、重要性,在信息多元化的今天,我们不可能掌握所有的知识,但是面对的复杂的情况又要求我们掌握一些自己专业知识之外的内容,这时候就需要掌握正确的相关信息,学会求助书籍或者网络等是必不可少的。查阅资料也使我们做的一切有理可依,而不是凭空想象。通过这次课程设计我发现了自身存在的许多不足之处,自己感觉理论上已经掌握的东西,却不真正了解它的内涵和工作原理,需要经过一番努力才能解决存在的困惑。这也很大地激发了我以后努力学习的兴趣。通过这次设计,我懂得了学习的重要性,学会了坚持、耐心和努力,这将为自己以后的学习和工作做最好的铺垫。参 考 文 献1 Anthony Jones,Jim Ohlund. Windows网络编程技术. 北京:机械工业出版社,1999. 2 汪翔,袁辉.Visual C+实践与提高网络编程篇.北京:中国铁道出版社,2000.

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 工程造价

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号