课程设计---Ping程序设计与实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程设计

课程名称____计算机网络_____

题目名称_Ping程序设计与实现

学生学院____计算机学院____

专业班级____08计科4班___

学号_______

2011年 1 月8 日

一、课程设计目的

本次课程设计的目的旨在通过网络相关程序的编写,使我们能深入理解TCP/IP协议机制,以及初步掌握基于Winsocket的网络编程技术。同时巩固相关的理论知识,为以后程序开发打下良好而又坚实的基础。

二、知识准备

1、ICMP协议

互联网控制信息协议(Internet CONTROL Message Protocol),用于错误报告和调试。该协议是TCP/IP协议集中的一个子协议,属于网络层协议,主要用于在主机与路由器之间传递控制信息,包括报告错误、交换受限控制和状态信息等。当遇到IP数据无法访问目标、IP路由器无法按当前的传输速率转发数据包等情况时,会自动发送ICMP消息。我们可以通过Ping命令发送ICMP回应请求消息并记录收到ICMP回应回复消息,通过这些消息来对网络或主机的故障提供参考依据。

常见ICMP报文有响应请求报文,目标不可到达、源抑制和超时报文,此外还有时间戳报文。2、Ping工作原理

Ping的原理就是首先建立通道,然后发送包,对方接受后返回信息,这个包至少包括以下内容:发送的时候,包的内容包括对方的ip地址和自己的地址,还有序列数;回送的时候包括双方地址,还有时间等,主要是接受方在都是在操作系统内核里做好的,时刻在监听。Ping程序生成一个icmp“回送请求”,将其发送给目的主机。通过检测是否可以收到目标主机的应答,便可以知道网络的连通性。

(3) Tracert 工作原理

透过向目标发送不同 IP 生存时间 (TTL) 值的ICMP回应数据包,Tracert 诊断程序确定到目标所采取的路由。要求路径上的每个路由器在转发数据包之前至少将数据包上的 TTL 递减 1。数据包上的 TTL 减为 0 时,路由器应该将“ICMP已超时”的消息发回源系统。Tracert 先发送 TTL 为 1 的响应数据包,并在随后的每次发送过程将 TTL 递增1,直到目标响应或 TTL 达到最大值,从而确定路由。透过检查中间路由器发回的“ICMP已超时”的消息确定路由。

三、界面设计及数据结构的说明

1 、MFC界面设计建立流程

步骤一:打开VC6.0,点击文件选项,在project选项卡中选择MFC Appwizard(exe),项目名称为ping。

步骤二:在新窗口中选择窗口类型为基于对话框的类型。

步骤三:设置界面选项

步骤四:设置窗口类型

步骤五:选择相应类,点击finish完成。

界面建立成功后添加相应按钮及功能模块。主界面设计如下:

2、数据结构的定义及说明

(1)定义IP头部

typedef struct _IpHeader

{

unsigned int HeaderLength:4; // 头部长度

unsigned int Version:4; // IP版本号

unsigned char TypeOfService; // 服务类型

unsigned short TotalLength; // 收发包的总长度

unsigned short Identification; // 唯一校验符

unsigned short FragmentationFlags; // 标志位

unsigned char TTL; // 生存时间

unsigned char Protocol; // 协议类型 (TCP, UDP 等)

unsigned short CheckSum; // IP头部校验和

unsigned int sourceIPAddress; // 源地址

unsigned int destIPAddress; // 目的地址

} IpHeader;

(2)定义ICMP头部

typedef struct _IcmpHeader

{

BYTE IcmpType; //icmp类型

BYTE IcmpCode; //编码类型

USHORT IcmpChecksum; //icmp校验和

USHORT IcmpId;

USHORT IcmpSeq; //icmp序列号

ULONG IcmpTimestamp; // 头部无标准定义,但仍需保留

} IcmpHeader;

(3)CIcmp类

class CIcmp : public CSocket

{

public:

BOOL OpenNewSocket(HWND hWnd, unsigned int NotificationMessage, long NotifyEvents);

BOOL OpenNewSocket(HWND hWnd, unsigned int NotificationMessage, long NotifyEvents, int AFamily, int AType, int AProtocol);

int CloseIcmpSocket(void);

BOOL Connect(int ReceiveTimeout, int SendTimeout);

BOOL Connect(LPINT ReceiveTimeout, LPINT SendTimeout, int AFamily, int AType, int AProtocol);

int SetTTL(int TTL);

int SetAsynchNotification(HWND hWnd, unsigned int Message, long Events);

int Receive(LPSTR pIcmpBuffer, int IcmpBufferSize);

unsigned long GetIPAddress (LPSTR iHostName);

int Ping (LPSTR pIcmpBuffer, int IcmpBufferSize);

unsigned short IcmpChecksum(unsigned short FAR *lpBuf, int Len);

void DisplayError(CString ErrorType, CString FunctionName);

public:

CIcmp(void);

CIcmp(CIcmp ©);

~CIcmp(void);

private:

public:

LPIcmpHeader pIcmpHeader;

LPIpHeader pIpHeader;

SOCKET icmpSocket;

SOCKADDR_IN icmpSockAddr;

SOCKADDR_IN rcvSockAddr;

DWORD icmpRoundTripTime;

DWORD icmpPingSentAt;

DWORD icmpPingReceivedAt;

int icmpRcvLen;

int icmpHops;

int icmpMaxHops;

相关文档
最新文档