计算机网络基础课程设计ping程序实现

上传人:第*** 文档编号:56340662 上传时间:2018-10-11 格式:PDF 页数:12 大小:367.11KB
返回 下载 相关 举报
计算机网络基础课程设计ping程序实现_第1页
第1页 / 共12页
计算机网络基础课程设计ping程序实现_第2页
第2页 / 共12页
计算机网络基础课程设计ping程序实现_第3页
第3页 / 共12页
计算机网络基础课程设计ping程序实现_第4页
第4页 / 共12页
计算机网络基础课程设计ping程序实现_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《计算机网络基础课程设计ping程序实现》由会员分享,可在线阅读,更多相关《计算机网络基础课程设计ping程序实现(12页珍藏版)》请在金锄头文库上搜索。

1、计计算算机机网网络络工工程程课课程程设设计计报报告告题目:Ping 程序的实现 学生姓名: 学号: 专业班级:计科专业 10102 班 同组姓名: 指导教师:设计时间:2013 年下学期第 16 周指导老师意见:评定成绩:签名:日期:年月日1目录一、课程设计的目的和意义2二、课程设计的内容和要求21.内容: 22.要求: 2三、课程设计的相关技术2四、课程设计过程21.Ping 主模块.22.功能控制模块43.数据报解析模块5五、课程设计小结6六、参考文献7七、附录(程序清单)7八、心得体会 112一、课程设计的目的和意义一、课程设计的目的和意义利用 ICMP 数据包、C 语言实现 Ping

2、命令程序,能实现基本的 Ping 操作, 发送 ICMP 回显请求报文,用于测试个主机到只一个主机之间的连通情况。通 过本程序的训练,使学生熟悉 ICMP 报文结构,使学生对 ICMP 有更深的理解,掌 握 Ping 程序的设计方法,掌握网络编程的方法和技巧,从而编写出功能更强大 的程序。二、课程设计的内容和要求二、课程设计的内容和要求1.1.内容:内容:用 C 语言实现 Ping 命令程序,能实现基本的 Ping 操作,发送 ICMP 回显请 求报文,用于测试个主机到只一个主机之间的连通情况。2.2.要求:要求:1)独立完成程序的设计、编码和调试。 2)系统利用 C 语言实现,程序调试环境为

3、 Turbo C 或 VC; 3)按照课程设计规范书写课程设计报告。 4)采用 VC 环境进行调试运行。三、课程设计的相关技术三、课程设计的相关技术由于 Ping 程序是面向用户的应用程序,该程序使用 ICMP 的封装机制,通过 IP 协议来工作。为了实现直接对 IP 和 ICMP 包进行操作,实验中使用 RAW 模式 的 socket 编程。首先定义 IP 数据报首部,在 IP 数据报的基础上定义 ICMP 数据 报首部,并初始化一些全局变量。接着自定义填充 ICMP 数据报字段函数 FillICMPData()、校验和函数 checksum()、解读 ICMP 报首部函数 DecodeIC

4、MPHeader()、释放资源函 Cleanup()。最后主函数通过调用这些函数来 实现 Ping 命令功能。IP 头与 ICMP 头的设置分别参照 RFC791 及 RFC792 的标准, 包含所有必要信息。主程序设置 main()函数,主函数用库函数实现套接字编 程用于数据包发送及接收,其中,数据包发送调用 sendto(),数据包接收调用 recvfrom( ),由于发送数据包时可能会遇到阻塞或者目标主机不通,造成超时, 因此需要在发送数据包后调用一个函数判断是否超时,此处调用库函数 setsockopt()来实现超时判断;其次,校验和函数采用移位方法进行计算。 套接字所需要的文件有头文

5、件 Winsocket2.h、库文件 WS2_32.LIB、动态库 W32_32.DLL。创建套接字的时候参数的以及在创建套接字之前必须首先使用 WSAStartup 函数。四、课程设计过程四、课程设计过程1.Ping1.Ping 主模块主模块 Ping()函数是本程序的核心部分,它基本是调用其他模块的函数来实现最终 功能,其主要布骤包括:定义及初始化各个全局变量、打开 socket 动态库、设置 接收和发送超时值、域名地址解析、分配内存、创建及初始化 ICMP 报文、发送 ICMP 请求报文、接收 ICMP 应答报文以及解读应答报文和输出 Ping 结果,最3后释放占用的资源其流程如下页图

6、2.1 所示。 注释: (1)该模块并非只有处理还包括判断及输出判断结果的含义; (2)程序没运行一次就只能输出四行结果(前提是输入的地址有效) ,欲 再次 PING 其他地址必须要重新启动程序。 (3)输入时不能输入目标主机名,不然 ping 结果为 TIMEOUT;开始定义及初始化各个全局变量判断 WSAStartup 函数是否调用成功输出调用失败否创建套接字以及设置 socket 接收超时,发送超时选项;是输入PING 的 IP 地址解析输入内容,设置 PING 参数创建及填充 ICMP 数据报文判断是否已发送四次Break;发送,接收以及解析数据包输出 PIING 结果是结束清除残余否

7、42.2.功能控制模块功能控制模块功能控制模块主要是为其他模块提供可调用的函数, 该模块主要包括参数获 取功能、计算 ICMP 数据报文检验和、清除 SOCKET,ICMP 包数据以及接受缓冲 区、占用资源释放功能和显示用尸帮助功能。该模块一共包含三个函数来实现。 , 流程如图 2.2 所示。Checksum 开始定义初始化 cksum(size 1)确定 cksum 及 size 大小是if (size)计算校验 cksum,获得结果cksum+= *(UCHAR*) buffer;否结束Cleanup 开始if (m_hSocket != INVALID_SOCKE关闭 套接 字释放占用资

8、源 清除 ICMP 包数据 以及接受缓冲区FWSACleanup();结束图图 2.2功能控制模块功能控制模块 注释: a.illICMPData 是由一系列的初始化的语句在流程图中不再画出; b.Cleanup()函数中的 WSACleanup(),HeapFree(),closesocket()都是一些库函数。 checksum()校验和函数是冗余校验的一种形式。 它是通过错误检测方法,对经 过空间(如通信)或者时间(如计算机存储)传送的数据的完整性进行检查的一种 简单方法。53.3.数据报解析模块数据报解析模块数据报解析模块提供了解读 IP 选项和解读 IcMP 报文的功能。 从本机收到

9、目 的主机返回的 1cMP 回显应答报文,就开始逐个地解读 IcMP 报文,如果需要记录 路由的情况下, IcMP 解析函数将调用 IP 选项解读函数来实现 IP 路由的输出 (但 本程序没有此功能。该模块主要由 DecodeICMPHeader 一个函数来实现,而中间 也会调用其它模块的相应函数。其流程图如图 2.3: 注释: a.判断是否为我们所要的数据报回应之前, 还有一些判断回应多少内容的语 句未呈现出; b.函数 GetTickCount()是用来记录此时我机所处的现在时间(毫秒级) ;DecodeICMPHeader定义相关变量以及初始化;tick = GetTickCount()

10、;为我们所要的回应报文;是输出不是我们所要;tick0icmpcount=tick-icmphdr-timestamp;判断时间是否小于 1msprintf(“Replyfrom%s:dytes=%dtimesin_addr),printf(“Replyfrom%s:dytes=%dtime=%dicmp_seq=%dn“,inet_ntoa(from-sin_addr),是是icmpcount+;结束结束否图图 2.3数据报解析模块数据报解析模块6五、课程设计小结五、课程设计小结1.运行操作结果:在 vc 里运行之后界面:2.输入本机 ip 地址:3.输入网上 ip 看结果:4. 但是当网络

11、连不通时,就会出现下图结果7六、参考文献六、参考文献【1】Visual C+网络通信编程实用案例精选(第二版)曹衍龙刘海英编著; 【2】Windows 网络编程技术 (美) ;七、附七、附录(程序清单)录(程序清单)#pragma comment(lib,“ws2_32.lib“) #include /创建套接字头文件 #include #include /标准输入输出函数 #include /实用程序库函数 #include typedef struct iphdr unsigned inth_len:4;/ 头长度 unsigned intversion:4;/ IP 版本 unsigne

12、d charservice;/ 服务类型 unsigned short total_len;/ 包的总长度 unsigned short ident;/ 包标示身份 unsigned short frag_and_flags;/ 标志 unsigned charttl;/ 包生命周期 unsigned charproto;/ 协议类型 unsigned short checksum;/ IP 校验 unsigned intsourceIP;/源 IP unsigned intdestIP;/目标 IP IpHeader; #define ICMP_ECHO8/ICMP 报文类型,回显请求 #d

13、efine ICMP_ECHOREPLY0/ICMP 报文类型,回显应答 #define ICMP_MIN8/最小的 ICMP 数据报大小 typedef struct icmphdr BYTEi_type;/ICMP 报文类型 BYTEi_code;/该类型中的代码号 USHORT i_cksum;/校验和8USHORT i_id;/惟一的标识符 USHORT i_seq;/序列号 ULONGtimestamp;/时间戳 IcmpHeader; #define DEF_PACKET_SIZE32/默认数据报大小 #define MAX_PACKET1024/ 最大的 ICMP 数据报大小 #

14、define MAX_IP_HDR_SIZE60/ 最大 IP 头长度 /初始化全局变量初始化全局变量 intdatasize=DEF_PACKET_SIZE; char *icmp_data=NULL; char *recvbuf=NULL; SOCKET m_hSocket= INVALID_SOCKET; char *lpdest=NULL; /填充填充 ICMP 数据报字段函数数据报字段函数 void FillICMPData(char *icmp_data, int datasize) IcmpHeader *icmp_hdr = NULL; char*datapart = NULL

15、; icmp_hdr = (IcmpHeader*)icmp_data; icmp_hdr-i_type = ICMP_ECHO; icmp_hdr-i_code = 0; icmp_hdr-i_id = (USHORT)GetCurrentProcessId(); icmp_hdr-i_cksum = 0; icmp_hdr-i_seq = 0; datapart = icmp_data + sizeof(IcmpHeader); /校验和函数 USHORT checksum(USHORT *buffer, int size) unsigned long cksum=0; while (si

16、ze 1) cksum += *buffer+;size -= sizeof(USHORT); if (size) cksum += *(UCHAR*)buffer; cksum = (cksum 16) + (cksum cksum += (cksum 16);return (USHORT)(cksum); /解读解读 ICMP 报首部函数报首部函数 void DecodeICMPHeader(char *buf, int bytes, SOCKADDR_IN *from) IpHeader*iphdr = NULL; IcmpHeader*icmphdr = NULL; unsigned shortiphdrlen; DWORDtick; static inticmpcount = 0;9iphdr = (IpHeader *)buf; iphdrlen = iphdr-h_len * 4; tick = GetTick

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

最新文档


当前位置:首页 > 办公文档 > 调研报告

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