欢迎来到冰点文库! | 帮助中心 分享价值,成长自我!
冰点文库
全部分类
  • 临时分类>
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • ImageVerifierCode 换一换
    首页 冰点文库 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    计算机网络课程设计ping工具.docx

    • 资源ID:2435949       资源大小:264.99KB        全文页数:21页
    • 资源格式: DOCX        下载积分:3金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    计算机网络课程设计ping工具.docx

    1、计算机网络课程设计ping工具摘 要关键词:PING命令,IP/ICMP协议,SOCKET编程摘要:本课程设计包含了PING程序设计应用其中PING程序设计使用了RAW模式的SOCKET编程,程序使用ICMP的封装机制,通过IP协议来工作。 本设计包括了具体设计任务,基本思路及所涉及的相关理论,设计流程图,调试过程中出现的问题及相应解决办法,实验运行结果,核心程序,个人体会及建议等。概要设计1.1题目的内容与要求内容:写一个程序,取代Windows 下的Ping命令,可以Ping指定主机、一批主机,并以图形显示输出结果。1.2总体结构本程序主要分为四个模块(功能模块图见图1.1):初始化模块,

    2、功能控制模块,数据报解读模块,Ping测试模块。图1.1 功能模块图 初始化模块:该模块用于定义及初始化各个全局变量,为winsock加载winsock体。功能控制模块:该模块是被其他模块调用,其功能包括解析参数、计算ICMP数据报文检验和、清除SOCKET,ICMP包数据以及接受缓冲区。数据报解读模块:数据报解析模块提供了解读IP选项和解读ICMP报文的功能。Ping测试模块:该模块是本程序的核心模块,调用其他模块实现其功能,进而实现Ping的功能。详细设计2.1 Ping主模块Ping()函数是本程序的核心部分,它基本是调用其他模块的函数来实现最终功能,其主要布骤包括:定义及初始化各个全局

    3、变量、打开socket动态库、设置接收和发送超时值、域名地址解析、分配内存、创建及初始化ICMP报文、发送ICMP请求报文、接收ICMP 应答报文以及解读应答报文和输出Ping结果,最后释放占用的资源其流程如图所示。先主要考虑实现ping 单一主机的情况,当ping 同一网段内的多台主机时只须循环调用ping 单一主机时的情况即可图2.1 主模块流程图2.2功能控制模块功能控制模块主要是为其他模块提供可调用的函数,该模块主要包括参数获取功能、计算ICMP数据报文检验和、清除SOCKET,ICMP包数据以及接受缓冲区、占用资源释放功能和显示用尸帮助功能。该模块一共包含三个函数来实现。,流程如图2

    4、.2所示。图2.2 功能控制模块1.2 基本思路及所涉及的相关理论1.2.1、设计基本思路在PING的工作原理下,PING程序基于ICMP,使用ICMP的回送请求和回送应答来工作。为了实现直接对IP和ICMP包进行操作,设计采用RAW模式的SOCKET编程,实现网络连通性的测试,探测主机到主机之间是否可通信,如果不能ping到某台主机,表明不能和这台主机建立连接。当传送IP数据包发生错误,ICMP协议将会把错误信息封包,然后传送回给主机。PING程序是面向用户的应用程序,该程序使用ICMP的封装机制,通过IP协议来工作。1.2.2、PING的工作原理PING 程序是用来探测主机到主机之间是否可

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

    6、安全的原因。ICMP数据包由8bit的错误类型和8bit的代码和16bit的校验和组成。而前 16bit就组成了ICMP所要传递的信息。PING利用ICMP协议包来侦测另一个主机是否可达。原理是用类型码为0的ICMP发请求,受到请求的主机则用类型码为8的ICMP回应。ping程序来计算间隔时间,并计算有多少个包被送达。用户就可以判断网络大致的情况。1.2.3、RAW模式的SOCKET编程 Windows Sockets规范以U.C. Berkeley大学BSD UNIX中流行的Socket接口为范例定义了一套Micorosoft Windows下网络编程接口。它不仅包含了人们所熟悉的Berke

    7、ley Socket风格的库函数;也包含了一组针对Windows的扩展库函数,以使程序员能充分地利用Windows消息驱动机制进行编程。 Windows Sockets规范本意在于提供给应用程序开发者一套简单的API,并让各家网络软件供应商共同遵守。此外,在一个特定版本Windows的基础上,Windows Sockets也定义了一个二进制接口(ABI),以此来保证应用Windows Sockets API的应用程序能够在任何网络软件供应商的符合Windows Sockets协议的实现上工作。因此这份规范定义了应用程序开发者能够使用,并且网络软件供应商能够实现的一套库函数调用和相关语义。 任何

    8、能够与Windows Sockets兼容实现协同工作的应用程序就被认为是具有Windows Sockets接口。我们称这种应用程序为Windows Sockets应用程序。 Windows Sockets规范定义并记录了如何使用API与Internet协议族(IPS,通常我们指的是TCP/IP)连接,尤其要指出的是所有的Windows Sockets实现都支持流套接口和数据报套接口. 应用程序调用Windows Sockets的API实现相互之间的通讯。Windows Sockets又利用下层的网络通讯协议功能和操作系统调用实现实际的通讯工作。程序详细设计说明初始化winsock2 网络环境

    9、WSADATA wsa; if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) cerr n初始化 WinSock2 DLL失败n error code: WSAGetLastError() endl; return -1; /将命令行参数转换为IP地址 u_long ulDestIP = inet_addr(argv2); if (ulDestIP = INADDR_NONE) /转换不成功时按域名解析 hostent* pHostent = gethostbyname(argv2); if (pHostent) ulDestIP=(*(in_addr*)pH

    10、ostent-h_addr).s_addr; /输出屏幕信息 cout n ping argv2 inet_ntoa(*(in_addr*)(&ulDestIP) ; else /解析主机名失败 cerr n解析主机名 argv2失败! n errorcode: WSAGetLastError() endl; WSACleanup(); return -1; else /输出屏幕信息 cout ping 主机 argv2endl; 填充目的Socket地址 sockaddr_in destSockAddr;ZeroMemory(&destSockAddr, sizeof(sockaddr_in

    11、); destSockAddr.sin_family = AF_INET; destSockAddr.sin_addr.s_addr = ulDestIP;创建Raw Socket SOCKET sockRaw = WSASocket(AF_INET, SOCK_RAW, IPPROTO_ICMP, NULL, 0, WSA_FLAG_OVERLAPPED); if (sockRaw = INVALID_SOCKET) cerr n创建 raw socket失败n; WSACleanup(); return -1; 设置端口属性 int iTimeout = DEF_ICMP_TIMEOUT;

    12、 if(setsockopt(sockRaw, SOL_SOCKET, SO_RCVTIMEO, (char*)&iTimeout, sizeof(iTimeout) = SOCKET_ERROR) cerr n设置发送时间超时失败n; closesocket(sockRaw); WSACleanup(); return -1; if(setsockopt(sockRaw, SOL_SOCKET, SO_SNDTIMEO, (char*)&iTimeout, sizeof(iTimeout) = SOCKET_ERROR) cerr n设置接收时间超时失败n ; closesocket(soc

    13、kRaw); WSACleanup(); return -1; 创建ICPM包发送缓冲区和接收缓冲区 char IcmpSendBufsizeof(ICMP_HEADER)+DEF_ICMP_DATA_SIZE; memset(IcmpSendBuf, 0, sizeof(IcmpSendBuf); char IcmpRecvBufMAX_ICMP_PACKET_SIZE; memset(IcmpRecvBuf, 0, sizeof(IcmpRecvBuf);填充待发送的ICMP包ICMP_HEADER* pIcmpHeader = (ICMP_HEADER*)IcmpSendBuf; pIc

    14、mpHeader-type = ICMP_ECHO_REQUEST; /类型为请求回显pIcmpHeader-code = 0; /代码字段为0pIcmpHeader-id = (USHORT)GetCurrentProcessId(); /ID字段为当前进程号 USHORT usSeqNo = 0;/以默认大小填充数据字段memset(IcmpSendBuf+sizeof(ICMP_HEADER),E, DEF_ICMP_DATA_SIZE);发送ICMP数据报 if (sendto(sockRaw, IcmpSendBuf, sizeof(IcmpSendBuf), 0, (sockadd

    15、r*)&destSockAddr,sizeof(destSockAddr)= SOCKET_ERROR /如果目的主机不可达则直接退出 if (WSAGetLastError() = WSAEHOSTUNREACH) cout 发送失败: WSAGetLastError() endl; closesocket(sockRaw); WSACleanup(); return 0; 接收ICMP数据报 while(1) iReadDataLen=recvfrom(sockRaw,IcmpRecvBuf, MAX_ICMP_PACKET_SIZE, 0, (sockaddr*)&from, &iFro

    16、mLen); if (iReadDataLen != SOCKET_ERROR) /有数据包到达 if(DecodeIcmpResponse(IcmpRecvBuf,iReadDataLen, stDecodeResult,ittl ) if(stDecodeResult.dwIPaddr.s_addr= destSockAddr.sin_addr.s_addr) Recived+; cout Reply from MaxTripTime) MaxTripTime=stDecodeResult.dwRoundTripTime; if(stDecodeResult.dwRoundTripTime

    17、MinTripTime) MinTripTime=stDecodeResult.dwRoundTripTime; /输出本次传输时间 if (stDecodeResult.dwRoundTripTime) cout :time=stDecodeResult.dwRoundTripTime ms ; else cout :time1 ms; cout TTl=int(ittl)endl; break; else cout Request timed out.; else if (WSAGetLastError() = WSAETIMEDOUT) /接收超时 cout Request timed

    18、out. endl; break; else cerr n接收数据失败!n error code: WSAGetLastError() endl; closesocket(sockRaw); WSACleanup(); return -1; 定义头类型文件#include StdAfx.htypedef struct unsigned char hdr_len :4; / length of the header unsigned char version :4; / version of IP unsigned char tos; / type of service unsigned sho

    19、rt total_len; / total length of the packet unsigned short identifier; / unique identifier unsigned short frag_and_flags; / flags unsigned char ttl; / time to live unsigned char protocol; / protocol (TCP, UDP etc) unsigned short checksum; / IP checksum unsigned long sourceIP; / source IP address unsi

    20、gned long destIP; / destination IP address IP_HEADER;/ICMP数据报头typedef struct BYTE type; /8位类型 BYTE code; /8位代码 USHORT cksum; /16位校验和 USHORT id; /16位标识符 USHORT seq; /16位序列号 ICMP_HEADER;/解码结果typedef struct USHORT usSeqNo; /包序列号 DWORD dwRoundTripTime; /往返时间 in_addr dwIPaddr; /对端IP地址 DECODE_RESULT;/线程参数

    21、struct Thread_Param char IPaddr120; char IPaddr220;typedef struct Thread_Param Thread_Param;typedef struct Thread_Param * pThread_Param;/ICMP类型字段const BYTE ICMP_ECHO_REQUEST = 8; /请求回显const BYTE ICMP_ECHO_REPLY = 0; /回显应答const BYTE ICMP_TIMEOUT = 11; /传输超时const DWORD DEF_ICMP_TIMEOUT = 50; /默认超时时间,单

    22、位msconst int DEF_ICMP_DATA_SIZE = 32; /默认ICMP数据部分长度const int MAX_ICMP_PACKET_SIZE = 1024; /最大ICMP数据报的大小const int DEF_MAX_HOP = 30; /最大跳站数USHORT GenerateChecksum(USHORT* pBuf,int iSize);BOOL DecodeIcmpResponse(char* pBuf,int iPacketSize,DECODE_RESULT& stDecodeResult,unsigned char &ittl);DWORD Single_

    23、ThreadProc(LPVOID lpParameter);DWORD Multi_ThreadProc(LPVOID lpParameter);class Ping public: Ping(); Ping(); void Action_Clear(); void SetMainHwnd(HWND hwnd); void Start(); void ScanSingleHost(char *IPaddr1,char *IPaddr2); void ScanMultiHost(char *IPaddr1,char *IPaddr2); private: HWND main_hwnd; pro

    24、tected:;输出窗口图形化设计StatusWindow : StatusWindow() nID = 0; num_parts = 1; hStatusWin = NULL;BOOL StatusWindow : CreateStatus(HWND hwnd,int num_parts,int *Width,int nID) this-nID = nID; if(Width = NULL) MessageBox(hwnd,TEXT(宽度数组不能为空!),TEXT(提示),MB_ICONWARNING); return FALSE; if(num_parts = 1& num_parts n

    25、um_parts = num_parts; else MessageBox(hwnd,TEXT(分栏数范围(1-255)!),TEXT(提示),MB_ICONWARNING); return FALSE; hStatusWin = CreateStatusWindow(WS_CHILD|WS_VISIBLE,NULL,hwnd,nID);/IDC_STATUS需要在resource.h里面自己定义 if(hStatusWin = NULL) MessageBox(hwnd,TEXT(创建状态栏失败!),TEXT(提示),MB_ICONERROR); return FALSE; BOOL res

    26、ult = SendMessage(hStatusWin,SB_SETPARTS,(WPARAM)num_parts,(LPARAM)Width); if(result = FALSE) MessageBox(hwnd,TEXT(设置分栏操作失败!),TEXT(提示),MB_ICONERROR); return result; return TRUE;StatusWindow : StatusWindow() BOOL StatusWindow : InsertItem(HWND hwnd,int Index_part,char *contents) if(Index_part num_par

    27、ts) MessageBox(hwnd,TEXT(状态栏索引错误!),TEXT(提示),MB_ICONWARNING); return FALSE; if(contents = NULL) MessageBox(hwnd,TEXT(内容不能为空!),TEXT(提示),MB_ICONWARNING); return FALSE; if(hStatusWin = NULL) MessageBox(hwnd,TEXT(状态栏句柄为空!),TEXT(提示),MB_ICONWARNING); return FALSE; BOOL ret = SendMessage(hStatusWin,SB_SETTEXT,(WPARAM)Index_part,(LPARAM)contents); if(ret = FALSE) MessageBox(hwnd,TEXT(状态栏插入文本操作失败!),TEXT(提示),MB_ICONWARNING); return ret; return TRUE;HWND StatusWindow : GethStatus() return hStatusWin;使用说明结果分析在VC中运行程序后会出现如下图所示,提示你输入IP当要pin


    注意事项

    本文(计算机网络课程设计ping工具.docx)为本站会员主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2023 冰点文库 网站版权所有

    经营许可证编号:鄂ICP备19020893号-2


    收起
    展开