3
图 2.2 系统流程图
3.3 参数获取( GetArgments() 函数)流程
获取的参数包括“ -r ”(记录路由)、“-n ”(记录条数程序,任意的整数)和
datasize( 数据报大小 ) 。程序首先判断每一个参数的第一字符, 如果第一个字符
是“ - ”(短横线),则认为是“ -r ”或者“ -n ”中的一个,然后作进一步判断。
如果该参数的第二个字符是数字, 则判断该参数为记录的条数, 如果该参数的第
二个字符是“ r ”,则判断该参数为“ -r ”, 用于记录路由;如果参数的第一个字
符是数字,则认为 参数是 IP 地址;或者 datasize, 然后作进一步的判断。如果
该参数中不存在非数字的字符, 则判断该参数为 datasize ;如果存在非数 字
的字符,则判断该参数为 IP 地址;其他情况则判断为主机名。
3.4ping() 函数流程
ping() 函数是本程序的核心部分它调用其他模块的函数来实现, 其主要步骤
包括创建接字,设置路由选项(如果需要的话) 、设置接收和发送超时值、名字
解析(如果需要的话) 、分配内存、创建 ICMP报文、发送 ICMP请求报文、接收
ICMP应答报文和解读 ICMP报文。
四.数据结构设计
本程序定义了 3 个结构体: -iphdr 、-icmphdr 、和 -ipotionhdr ,分别用于
存放 IP 报头信息、 ICM P 报头信息和 IP 路由选项信息。
4.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: 分段标志,表示过长的数据报是否要分段。