Ping程序设计(c语言课程设计)

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

07网络工程本

制作人:北-624寝室

负责人:赖文斌

第四篇网络编程

第九章ping程序设计

ping命令是使用频率极高的一个网络测试命令,用以测试从一个主机到另一个主机间的网络上否可达。windows自带的ping命令具有强大的功能,它有很多选项用于实现不同的测试目的。本章模仿windows的ping命令,用c语言实现了一个简单的命令。本章着重讲述ping命令的实现原理和c语言的网络编程方法。读者可以在本章的基础上,对本章实现的ping命令进行扩展,开发出功能更强大、更完善的ping命令,并进一步掌握网络编程的方法。

9.1 设计目的

本章通过设计Ping程序,讲解Ping程序的实现原理,并初步讲解了c语言网络编程技术。本章涉及很多网络编程函数和编程技巧。包括库文件的导入;winsock的初始化、注销;socket 的创建、关闭;设置socket选项;根据主机名获取IP地址;从堆中分配一定数量的空间、释放从堆中分配的空间;获取当前进程ID号;数据报的发送;数据报的接等。

通过本程序的训练,使读者对网络编程有一定的了解,掌握Ping程序的设计方法,掌握网络编程的方法和技巧,从而编写出功能更强大的程序。

9.2功能描述

本章用 c 语言实现的ping命令,能用于测试一个主机到另一个主机间的联通情况,程序还提供了几个选项以实现不同的功能。

(1)实现ping功能。程序能实现基本的ping操作,发送ICMP回显请求报文,接收显应答报文。

(2)能记录路由。程序提供了“-r”选项,用以记录从源主机到目的主机的路由。

(3)能输出指定条数的记录。程序提供了“-n”选项,用以输出指定条数的记录。

(4)能按照指定大小输出每条记录。程序提供了“datasize”选项,用以指定输出的数据报的大小。

(5)能输出用户帮助。程序提供了用户帮助,显示程序提供的选项以及选项格式等。

9.3 总体设计

9.3.1 功能模块设计

1. 功能模块图

本系统共有 4 个模块,分别是初始化模块、功能控制模块、数据控制模块、数据报解读模块和ping测试模块,如图9.1所示。各模块功能描述如下。

图9.1 系统模块图

(1) 初始化模块。改模块用于初始化各个全局变量,为全局变量赋初始值;初始化,加载库。

(2)功能控制模块。改模块是被其它模块调用,其功能包括获取参数、计算校验和填充数据报文、释放占用资源和显示用户帮助。

(3)数据报解读模块。改模块用于解读接收到的报文和选项。

(4)测试模块。改模块是本程序的核心模块,调用其他模块实现其功能,主要是实现的功能。

2.系统流程图

系统执行的流程图9.2所示。程序首先调用IniPing()函数初始化各全局变量,然后GetArgments()函数获取用户输入的参数,检查用户输入的参数,如果参数不正确或者没有输入参数,则显示用户帮助信息(User help ),并结束程序;如果参数正确,则对指定目的地执行Ping命令,如果Ping通,则显示Ping结果并释放占用资源,如果没有Ping通,则报告错误信息,并释放占用资源。

图9.2 系统流程图

3.参数获取(GetArgments()函数)流程图

获取的参数包括“-r”(记录路由)、“-n”(记录条数程序,任意的整数)和datasize(数据报大小)。程序首先判断每一个参数的第一字符,如果第一个字符是“-”(短横线),则认为是“-r”或者“-n”中的一个,然后作进一步判断。如果该参数的第二个字符是数字,则判断该参数为记录的条数,如果该参数的第二个字符是“r”,则判断该参数为“-r”,用于

记录路由;如果参数的第一个字符是数字,则认为参数是IP地址;或者datasize,然后作进一步的判断。如果该参数中不存在非数字的字符,则判断该参数为datasize;如果存在非数字的字符,则判断该参数为IP地址;其他情况则判断为主机名。参数获取的流程如图9.3所示。

图9.3 参数获取流程图

4.ping()函数流程图

ping()函数是本程序的核心部分它调用其他模块的函数来实现,其主要步骤包括创建接字,设置路由选项(如果需要的话)、设置接收和发送超时值、名字解析(如果需要的话)、分配内存、创建ICMP报文、发送ICMP请求报文、接收ICMP应答报文和解读ICMP报文。其执行流程如图9.4所示。

图9.4 Ping 函数流程图

9.3.2数据结构设计

本程序定义了3个结构体:-iphdr、-icmphdr、和-ipotionhdr,分别用于存放IP报头信息、ICM P报头信息和IP路由选项信息。

1.定义IP报头结构体

Typedef struct _iphdr

{

Unsigned int h_len:4;

Unsigned int version:4;

Unsigned char tos;

Unsigned short total_len;

Unsigned short ident;

Unsigned short frag_flags;

Unsigned char ttl;

Unsigned chor proto;

Unsigned short checksum;

Unsigned int sourceIP;

Unsigned int destIP;

} IpHeader;

h-len:4 : 表示IP报头长度,首部长度指的是首部占32bit字的数目,包括任何选项。

由于它是一个4bit 字段,因此首部最长为60个字节,不包括任何选项的

IP报头是20个字节。

Version:4: 表示IP的版本号,这里表示Ipv4.。

Top: 表示服务的类型,可以表示最小时延,最大吞吐量,最高可靠性和最小费用。

Total –len: 整个IP数据报的总长度。

Ident: 唯一的标识符,标识主机发送的每一份数据报。

Frag-flags: 分段标志,表示过长的数据报是否要分段。

Ttl: 生存期,表示数据报可以经过的最多路由器数。

Proto: 协议类型(TCP、UDP等)。

Checksum: 校验和。

sourceIP: 源IP地址。

destIP: 目的IP地址。

2.定义ICMP报头结构体

Typedef struct –icmphdr

{

BYTE i_type;

BYTE i_code :

USHORT i_cksum;

USHORT i_id;

USHORT i_seq;

ULONG timestamp;

} IcmpHeader;

其中各字段表示意义如下。

I_tye : ICMP报文类型。

I_code : 该类型中的代码号,一种ICMP 报文的类型号和该类型中的代码号共同决定。、

I_cksum: 校验和。

I_seq: 序列号,序列号从0开始,每发送一次新的回显请求就加1. Timestamp: 时间。

3.定义IP 选项结构体

Typedef struct _ipoptionhdr

{

Unsigned char code;

Unsigned char len;

Unsigned char ptr;

Unsigned loang addr[9];

} IcmpHeader;

相关文档
最新文档