当前位置:
文档之家› 计算机网络基础课程设计PING程序的实现
计算机网络基础课程设计PING程序的实现
开始
定义及初始化各个全局变量
否 输出调用失败
判断 WSAStartup 函数是 否调用成功
是 创建套接字以及设置 socket 接收 超时,发送超时选项;
输入 PING 的 IP 地址
解析输入内容,设置 PING 参数
创建及填充 ICMP 数据报文
判断是否已发送 四次
是 Break;
否 发送,接收以及解析数据包
time=%d
icmp_seq
= %d\n",inet_ntoa(from->sin_addr),
icmpcount++;
结束 图 2.3 数据报解析模块
5
五、课程设计小结
1.运行操作结果:在 vc 里运行之后界面:
2.输入本机 ip 地址:
3.输入网上 ip 看结果: 4. 但是当网络连不通时,就会出现下图结果
四、课程设计过程
1.Ping 主模块 Ping()函数是本程序的核心部分,它基本是调用其他模块的函数来实现最终
功能,其主要布骤包括:定义及初始化各个全局变量、打开 socket 动态库、设置 接收和发送超时值、域名地址解析、分配内存、创建及初始化 ICMP 报文、发送 ICMP 请求报文、接收 ICMP 应答报文以及解读应答报文和输出 Ping 结果,最
//校验和
7
USHORT i_id;
//惟一的标识符
USHORT i_seq;
//序列号
ULONG timestamp;
//时间戳
} IcmpHeader;
#define DEF_PACKET_SIZE 32
//默认数据报大小
#define MAX_PACKET
1024
// 最大的 ICMP 数据报大小
#include <stdio.h>//标准输入输出函数
#include <stdlib.h>//实用程序库函数
#include <string.h>
typedef struct iphdr
{
unsigned int h_len:4;
// 头长度
unsigned int version:4;
// IP 版本
输出不是我们所要;
tick0[icmpcount]=tick icmphdr->timestamp;
结束
判断时间是否小于 1ms
是
是
printf("Reply from %s: dytes=%d
time<1ms
icmp_seq
= %d\n",inet_ntoa(from->sin_addr),
printf("Reply from %s: dytes=%d
2
后释放占用的资源其流程如下页图 2.1 所示。 注释:
(1) 该模块并非只有处理还包括判断及输出判断结果的含义; (2) 程序没运行一次就只能输出四行结果(前提是输入的地址有效),欲
再次 PING 其他地址必须要重新启动程序。 (3) 输入时不能输入目标主机名,不然 ping 结果为 TIMEOUT;
计算机网络工程课程设计报告
题 目: 学生姓名: 学 号: 专业班级: 同组姓名: 指导教师:
设计时间:
Ping 程序的实现 计科专业 10102 班 2013 年下学期第 16 周
指导老师意见:
评定成绩:
签名: 日期: 年 月 日
目录
一、课程设计的目的和意义...................................................... 2 二、课程设计的内容和要求...................................................... 2 1.内容:...................................................................................... 2 2.要求:...................................................................................... 2 三、课程设计的相关技术.......................................................... 2 四、课程设计过程...................................................................... 2 1.Ping 主模块............................................................................. 2 2.功能控制模块.......................................................................... 4 3.数据报解析模块...................................................................... 5 五、课程设计小结...................................................................... 6 六、参考文献.............................................................................. 7 七、附 录(程序清单)........................................................ 7 八、心得体会............................................................................ 11
三、课程设计的相关技术
由于 Ping 程序是面向用户的应用程序,该程序使用 ICMP 的封装机制,通过 IP 协议来工作。为了实现直接对 IP 和 ICMP 包进行操作,实验中使用 RAW 模式 的 socket 编程。首先定义 IP 数据报首部,在 IP 数据报的基础上定义 ICMP 数据 报首部,并初始化一些全局变量。接着自定义填充 ICMP 数据报字段函数 FillICMPData()、校验和函数 checksum()、解读 ICMP 报首部函数 DecodeICMPHeader()、释放资源函 Cleanup()。最后主函数通过调用这些函数来 实现 Ping 命令功能。IP 头与 ICMP 头的设置分别参照 RFC791 及 RFC792 的标准, 包含所有必要信息。主程序设置 main()函数,主函数用库函数实现套接字编 程用于数据包发送及接收,其中,数据包发送调用 sendto(),数据包接收调用 recvfrom( ),由于发送数据包时可能会遇到阻塞或者目标主机不通,造成超时, 因此需要在发送数据包后调用一个函数判断是否超时,此处调用库函数 setsockopt()来实现超时判断;其次,校验和函数采用移位方法进行计算。 套 接字所 需要的文 件有 头文件 Winsocket2.h、库文 件 WS2_32.LIB、动态 库 W32_32.DLL。创建套接字的时候参数的以及在创建套接字之前必须首先使用 WSAStartup 函数。
1
一、课程设计的目的和意义
利用 ICMP 数据包、C 语言实现 Ping 命令程序,能实现基本的 Ping 操作, 发送 ICMP 回显请求报文,用于测试—个主机到只一个主机之间的连通情况。通 过本程序的训练,使学生熟悉 ICMP 报文结构,使学生对 ICMP 有更深的理解,掌 握 Ping 程序的设计方法,掌握网络编程的方法和技巧,从而编写出功能更强大 的程序。
unsigned char service;
// 服务类型
unsigned short total_len;
// 包的总长度
unsigned short ident;
// 包标示身份
unsigned short frag_and_flags; // 标志
unsigned char ttl;
// 包生命周期
释放占用资源 清 除 ICMP 包 数 据 以及接受缓冲区
WSACleanup();
结束
结束
图 2.2 功能控制模块
注释: a.illICMPData 是由一系列的初始化的语句在流程图中不再画出; b.Cleanup()函数中的 WSACleanup(),HeapFree(),closesocket()都是一些库函数。 checksum()校验和函数是冗余校验的一种形式。 它是通过错误检测方法,对经 过空间(如通信)或者时间(如计算机存储)传送的数据的完整性进行检查的一种 简单方法。
6
六、参考文献
【1】Visual C++网络通信编程实用案例精选(第二版)曹衍龙 刘海英 编著; 【2】Windows 网络编程技术 (美);
七、附 录(程序清单)
#pragma comment(lib,"ws2_32.lib")
#include <winsock2.h>//创建套接字头文件
#include <ws2tcpip.h>
Checksum 开始
Cleanup 开始
定义初始化 cksum
(size > 1) 是
确定 cksum 及 size 大小
if (size) 否
cksum += *(UCHAR*) buffer;
计算校验 cksum,获得结果
if (m_hSocket != INVALID_SOCKE
关闭
套接
F
字
注释: a.判断是否为我们所要的数据报回应之前,还有一些判断回应多少内容的语