ImageVerifierCode 换一换
格式:DOCX , 页数:22 ,大小:91.14KB ,
资源ID:4699399      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4699399.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(网络课程设计.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

网络课程设计.docx

1、网络课程设计信息科学与工程学院课程设计任务书 题目: PING程序设计与实现 学 号: 姓 名: 专 业: 课 程: 计算机网络 指导教师: 职称: 完成时间: 2012年5月-2012年6月信息科学与工程学院制 2012年6月24日课程设计任务书及成绩评定课程设计的任务和具体要求课程设计任务: PING程序用于测试网络连通性的程序。通过PING程序的设计,能初步掌握TCP/IP网络协议的基本实现方法,对网络的实现机制有进一步的认识。了解网络编程,对计算机网络有进一步的认识。课程设计具体要求: (1)熟悉原始套接字编程; (2)了解网络的结够; (3)了解网络的底层传输协议; (4)在Wind

2、ows下实现Ping程序;指导教师签字: 、 日期: 指导教师评语成绩: 指导教师签字: 日期: 课程设计所需软件、硬件等所需软件: VC+ 6.0、 Word 2010所需硬件: PC机课程设计进度计划起至日期工作内容备注2012.6.162012.6.182012.6.182012.6.202012.6.212012.6.24搜集资料、准备课程设计编写代码、实现ping程序撰写课程设计的实验报告参考文献、资料索引序号文献、资料名称编著者出版单位1 计算机网络(第五版) 谢希仁 电子工业出版社2 计算机网络(第四版) 雷震甲 西安科技出版社3 计算机网络(第四版) 特南鲍姆 清华大学出版社4

3、 VC+程序设计项目实践 贾振华 清华大学出版社目 录一、设计原理 .4 1.1工作原理.4 1.2网络编程 .4二、功能模块设计.5 2.1功能模块.5 2.2系统流程.5三、函数功能描述.7 3.1初始化函数.7 3.2功能函数.7 3.3主函数.7四、程序实现.8 4.1 程序预处理及初始 .8 4.2 功能控制模块 .10 4.3 数据报解读模块 .12 4.4 功能测试 .13五、运行结果16六、总结.17一设计原理:1、PING的工作原理ping 程序是用来探测主机到主机之间是否可通信,如果不能ping到某台主机,表明不能和这台主机建立连接。ping 使用的是ICMP协议,它发送I

4、CMP回送请求消息给目的主机。ICMP协议规定:目的主机必须返回ICMP回送应答消息给源主机。如果源主机在一定时间内收到应答,则认为主机可达。ICMP协议通过IP协议发送的,IP协议是一种无连接的,不可靠的数据包协议。因此,保证数据送达的工作应该由其他的模块来完成。其中一个重要的模块就是ICMP(网络控制报文)协议。当传送IP数据包发生错误比如主机不可达,路由不可达等等,ICMP协议将会把错误信息封包,然后传送回给主机。给主机一个处理错误的机会,这也就是为什么说建立在IP层以上的协议是可能做到安全的原因。ICMP数据包由8bit的错误类型和8bit的代码和16bit的校验和组成。而前 16bi

5、t就组成了ICMP所要传递的信息。PING利用ICMP协议包来侦测另一个主机是否可达。原理是用类型码为0的ICMP发请求,受到请求的主机则用类型码为8的ICMP回应。ping程序来计算间隔时间,并计算有多少个包被送达。用户就可以判断网络大致的情况。2、RAW模式的SOCKET编程 PING程序是面向用户的应用程序,该程序使用ICMP的封装机制,通过IP协议来工作。为了实现直接对IP和ICMP包进行操作,实验中使用RAW模式的SOCKET编程。熟悉SOCKET的编程,包括基本的系统调用如SOCKET、BIND等.3、具体内容(1)定义数据结构 需要定义好IP数据报、ICMP包等相关的数据结构(2

6、)程序实现 在WINDOWS环境下实现PING程序二、功能模块设计1. 功能模块图本系统共有 4 个模块,分别是初始化模块、功能控制模块、数据控制模块、数据报解读模块和ping测试模块,如图9.1所示。各模块功能描述如下。 (1) 初始化模块。改模块用于初始化各个全局变量,为全局变量赋初始值;初始化,加载库。 (2)功能控制模块。改模块是被其它模块调用,其功能包括获取参数、计算校验和填充数据报文、释放占用资源和显示用户帮助。 (3)数据报解读模块。改模块用于解读接收到的报文和选项。(4)测试模块。改模块是本程序的核心模块,调用其他模块实现其功能,主要是实现的功能。 2系统流程图 系统执行的流程

7、图9.2所示。程序首先调用IniPing()函数初始化各全局变量,然后GetArgments()函数获取用户输入的参数,检查用户输入的参数,如果参数不正确或者没有输入参数,则显示用户帮助信息(User help ),并结束程序;如果参数正确,则对指定目的地执行Ping命令,如果Ping通,则显示Ping结果并释放占用资源,如果没有Ping通,则报告错误信息,并释放占用资源。3、函数功能描述 1.初始化函数 IntPing() 函数原型:void IntPing() IntPing()函数用于初始化ping 所需的全局变量,为各个变量赋初始值。 userHelp() 函数原型:void user

8、Help() userHelp()函数用于显示用户帮助信息。 GetArgments() 函数原型:void GetArgments(int argc, char*argv) GetArgments()函数用于获取用户提交的参数。 checkSum() 函数原型:USHORT checkSum(USHORT *buffer,int size) checkSum()函数用于计算校验和。 2.功能函数 FillCMPData() 函数原型:void FillCMPData() FillCMPData()函数用于填充ICMP数据报中各个字段。 reeRes() 函数原型:void reeRes()

9、reeRes()函数用于释放占用的资源,包括关闭初始化socket 调用的函数的、关闭创建的socket和释放分配的内存等。 DecodeIPOptions() 函数原型:void DecodeIPOptions() DecodeIPOptions()函数用于解读IP选项。 DecodelICMPHeader() 原型:void DecodelICMPHeader(char*buf,int bytes,SOCKADDR_IN*from) DecodelICMPHeader()函数用于解读ICMP报文信息。3.ping函数 PingTest() 函数原型:void PingTest(int ti

10、meout) PingTest()函数用于进行Ping操作。其中timeout表示设定的发送超时值。四、程序实现 1. 程序预处理/*导入库文件*/#pragma comment( lib, ws2_32.lib )/*加载头文件*/#include #include #include #include #include #define IP_RECORD_ROUTE 0x7/*默认数据报大小*/#define DEF_PACKET_SIZE 32 /*最大的ICMP数据报大小*/#define MAX_PACKET 1024 /*最大IP头长度*/#define MAX_IP_HDR_SIZ

11、E 60 /*ICMP报文类型,回显请求*/ #define ICMP_ECHO 8/*ICMP报文类型,回显应答*/ #define ICMP_ECHOREPLY 0/*最小的ICMP数据报大小*/#define ICMP_MIN 8void InitPing();void UserHelp();void GetArgments(int argc, char* argv); USHORT CheckSum(USHORT *buffer, int size);void FillICMPData(char *icmp_data, int datasize);void FreeRes();void

12、 DecodeIPOptions(char *buf, int bytes);void DecodeICMPHeader(char *buf, int bytes, SOCKADDR_IN* from);void PingTest(int timeout)typedef struct _iphdr unsigned int h_len:4; /*IP报头长度*/ unsigned int version:4; /*IP的版本号*/ unsigned char tos; /*服务的类型*/ unsigned short total_len; /*数据报总长度*/ unsigned short i

13、dent; /*惟一的标识符*/ unsigned short frag_flags; /*分段标志*/ unsigned char ttl; /*生存期*/ unsigned char proto; /*协议类型(TCP、UDP等)*/ unsigned short checksum; /*校验和*/ unsigned int sourceIP; /*源IP地址*/ unsigned int destIP; /*目的IP地址*/ IpHeader;typedef struct _icmphdr BYTE i_type; /*ICMP报文类型*/ BYTE i_code; /*该类型中的代码号

14、*/ USHORT i_cksum; /*校验和*/ USHORT i_id; /*惟一的标识符*/ USHORT i_seq; /*序列号*/ ULONG timestamp; /*时间戳*/ IcmpHeader;typedef struct _ipoptionhdr unsigned char code; /*选项类型*/ unsigned char len; /*选项头长度*/ unsigned char ptr; /*地址偏移长度*/ unsigned long addr9; /*记录的IP地址列表*/ IpOptionHeader;SOCKET m_socket;IpOptionH

15、eader IpOption;SOCKADDR_IN DestAddr;SOCKADDR_IN SourceAddr;char *icmp_data;char *recvbuf;USHORT seq_no ;char *lpdest;int datasize;BOOL RecordFlag;double PacketNum;BOOL SucessFlag;初始化模块/*初始化变量函数*/ void InitPing() WSADATA wsaData; icmp_data = NULL; seq_no = 0; recvbuf = NULL; RecordFlag = FALSE; lpdes

16、t = NULL; datasize = DEF_PACKET_SIZE; PacketNum = 5; SucessFlag = FALSE; if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) printf(WSAStartup() failed: %dn, GetLastError(); return ; m_socket = INVALID_SOCKET;2. 功能控制模块/*显示信息函数*/void UserHelp() printf(UserHelp: ping -r data sizen); printf( -r record route

17、n); printf( -n record amountn); printf( host remote machine to pingn); printf( datasize can be up to 1KBn); ExitProcess(-1); void GetArgments(int argc,char* argv) int i; int j; int exp; int len; int m; if(argc = 1) printf(nPlease specify the destination IP address and the ping option as follow!n); U

18、serHelp(); for(i = 1; i =1;j-,exp+) PacketNum += (double)(argvij-48)*pow(10,exp); else switch (tolower(argvi1) case r: RecordFlag = TRUE; break; default: UserHelp(); break; else if (isdigit(argvi0) for(m=1;m 1) cksum += *buffer+; size -= sizeof(USHORT); if (size) cksum += *(UCHAR*)buffer; /*对每个16bit

19、进行二进制反码求和*/ cksum = (cksum 16) + (cksum & 0xffff); cksum += (cksum 16); return (USHORT)(cksum);void FillICMPData(char *icmp_data, int datasize) IcmpHeader *icmp_hdr = NULL; char *datapart = NULL; icmp_hdr = (IcmpHeader*)icmp_data; icmp_hdr-i_type = ICMP_ECHO; icmp_hdr-i_code = 0; icmp_hdr-i_id = (US

20、HORT)GetCurrentProcessId(); icmp_hdr-i_cksum = 0; icmp_hdr-i_seq = 0; datapart = icmp_data + sizeof(IcmpHeader); memset(datapart,0,datasize-sizeof(IcmpHeader);void FreeRes() if (m_socket != INVALID_SOCKET) closesocket(m_socket); HeapFree(GetProcessHeap(), 0, recvbuf); HeapFree(GetProcessHeap(), 0, i

21、cmp_data); WSACleanup(); return ;3. 数据报解读模块/*解读IP选项头函数*/void DecodeIPOptions(char *buf, int bytes) IpOptionHeader *ipopt = NULL; IN_ADDR inaddr; int i; HOSTENT *host = NULL; ipopt = (IpOptionHeader *)(buf + 20); printf(RR: ); for(i = 0; i ptr / 4) - 1; i+) inaddr.S_un.S_addr = ipopt-addri; if (i !=

22、0) printf( ); host=gethostbyaddr(char*)&inaddr.S_un.S_addr,sizeof(inaddr.S_un.S_addr), AF_INET); if (host) printf(%-15s) %sn, inet_ntoa(inaddr), host-h_name); else printf(%-15s)n, inet_ntoa(inaddr); return;void DecodeICMPHeader(char *buf, int bytes, SOCKADDR_IN *from) IpHeader *iphdr = NULL; IcmpHea

23、der *icmphdr = NULL; unsigned short iphdrlen; DWORD tick; static int icmpcount = 0; iphdr = (IpHeader *)buf; iphdrlen = iphdr-h_len * 4; tick = GetTickCount(); if (iphdrlen = MAX_IP_HDR_SIZE) & (!icmpcount) DecodeIPOptions(buf, bytes); if (bytes sin_addr); icmphdr = (IcmpHeader*)(buf + iphdrlen); if

24、 (icmphdr-i_type != ICMP_ECHOREPLY) printf(nonecho type %d recvdn, icmphdr-i_type); return; if (icmphdr-i_id != (USHORT)GetCurrentProcessId() printf(someone elses packet!n); return ; SucessFlag = TRUE;printf(%d bytes from %s:, bytes, inet_ntoa(from-sin_addr); printf( icmp_seq = %d. , icmphdr-i_seq);

25、 printf( time: %d ms, tick - icmphdr-timestamp); printf(n); icmpcount+; return;4. Ping 测试模块/*ping函数*/void PingTest(int timeout) int ret; int readNum; int fromlen; struct hostent *hp = NULL; m_socket = WSASocket(AF_INET, SOCK_RAW, IPPROTO_ICMP, NULL, 0,WSA_FLAG_OVERLAPPED); if (m_socket = INVALID_SOC

26、KET) printf(WSASocket() failed: %dn, WSAGetLastError(); return ; if (RecordFlag) ZeroMemory(&IpOption, sizeof(IpOption); /*为每个ICMP包设置路由选项*/ IpOption.code = IP_RECORD_ROUTE; IpOption.ptr = 4; IpOption.len = 39; ret = setsockopt(m_socket, IPPROTO_IP, IP_OPTIONS,(char *)&IpOption, sizeof(IpOption); if (ret = SOCKET_ERROR) printf(setsockopt(IP_OPTIONS) failed: %dn,WSAGetLastError(); readNum = setsockopt(m_socket, SOL_SOCKET, SO_RCVTIMEO,(char*)&timeout, sizeof(timeout); if(read

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1