网络端对端连通测试软件课程设计报告.docx
《网络端对端连通测试软件课程设计报告.docx》由会员分享,可在线阅读,更多相关《网络端对端连通测试软件课程设计报告.docx(39页珍藏版)》请在冰点文库上搜索。
课程设计成绩
考勤成绩
实做成绩
报告成绩
总评成绩
指导教师签名:
《信号处理实验与设计》设计报告
论文题目:
网络端对端连通测试软件
学院(系):
电子信息与自动化学院
班
级:
学生姓名:
指导教师:
学号
时间:
2014年9月9日到2014年9月24日
摘要
ping命令是使用频率极高的一个网络测试命令,用以测试从一个主机到另一个主机间的网络上否可达。
windows自带的ping命令具有强大的功能,它有很多选项用于实现不同的测试目的。
本章模仿windows的ping命令,用c语言实现了一个简单的命令。
本章着重讲述ping命令的实现原理和c语言的网络编程方法。
读者可以在本章的基础上,对本章实现的ping命令进行扩展,开发出功能更强大、更完善的ping命令,并进一步掌握网络编程的方法。
关键词:
ping,命令,网络,测试
目录
摘要.
...........................................................................................................................I
1设计目的..................................................................................................................3
2设计内容..................................................................................................................3
3设计要求..................................................................................................................3
3.1基本要求............................................................................................................3
3.2较高要求...........................................................................................................3
3.3其它要求...........................................................................................................3
4设计原理..................................................................................................................3
4.1TCP/IP..............................................................................................................3
4.2Ping的基础知识..............................................................................................3
4.3ICMP协议与校验和的计算...........................................................................4
4.4Ping程序设计思路..........................................................................................5
5软件设计..................................................................................................................5
5.1初始化模块........................................................................................................7
5.2功能控制模块....................................................................................................7
5.3Ping模块功能模块...........................................................................................8
5.4main函数模块.................................................................................................10
6调试过程、实验结果分析.......................................................................................10
7体会和建议...............................................................................................................13
8参考文献...................................................................................................................14
附录:
源程序..............................................................................................................15
1、设计目的
本课程通过设计Ping程序,掌握Ping程序的实现原理,并实现了c语言网络编程技术,增强对网络编程的了解,提升编程能力,掌握技巧。
本课程设计涉及很多网络编程函数和编程技巧。
包括库文件的导入;winsock的初始化、注销;socket的创建、关闭;设置socket选项;根据主机名获取IP地址;从堆中分配一定数量的空间、释放从堆中分配的空间;获取当前进程ID号;数据报的发送;数据报的接等。
通过本程序的训练,使读者对网络编程有一定的了解,掌握Ping程序的设计方法,掌握网络编程的方法和技巧,从而编写出功能更强大的程序。
2、设计内容
基于WindowsXP+VisualC++6.0环境下,实现库文件的导入;winsock的初始化、注销;socket的创建、关闭;设置socket选项;根据主机名获取IP地址;从堆中分配一定数量的空间、释放从堆中分配的空间;获取当前进程ID号;数据报的发送;数据报的接等。
多阅读一些复杂的程序,了解一个基本的函数、算法和精良的编程思想,学会代码的重复使用,多动手写写一些有一定难度的程序等等。
3、设计要求
3.1基本要求:
(1)最终完成的程序能在DOS环境下运行。
(2)能正确的测试出可以到达的主机和不可到达的主机。
(3)能解析网络域名和支持帮助。
如:
程序名/?
3.2较高要求:
(1)能在WINDOWS环境下运行,并在窗口下显示回显结果。
(2)能回显经过的路由信息。
3.3其他要求:
编程语言、方法和手段不限制。
4、设计原理
4.1TCP/IP:
TransmissionControlProtocol/InternetProtocol的简写,中译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议、Internet国际互联网络的基础,由网络层的IP协议和传输层的TCP协议组成。
TCP/IP定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。
协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的协议来完成自己的需求。
通俗而言:
TCP负责发现传输的问题,一有问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地。
而IP是给因特网的每一台联网设备规定一个地址。
4.2Ping的基础知识:
原始套接字是允许访问底层传输协议的一种套接字类型。
使用原始套接字操作IP数据报,可以进行路由跟踪,Ping等。
另外,使用原始套接字需要知道许多下层协议结构的知识,所以下面讨论ICMP,IP,UDP,TCP格式。
原始套接字有两种类型,第一种类型是在IP头种使用预定义的协议,如ICMP;第二种类型是在IP头种使用自定义的协议。
Ping程序是用来探测主机到主机之间是否可通信,如果不能Ping到某台主机,表明不能和这台主机建立连接。
Ping使用的是ICMP协议,它发送ICMP回送请求消息给目的主机。
ICMP协议规定:
目的主机必须返回ICMP回送应答消息给源主机。
如果源主机在一定时间内收到应答,则认为主机可达。
ICMP协议通过IP协议发送的,IP协议是一种无连接的,不可靠的数据包协议。
因此,保证数据送达的工作应该由其他的模块来完成。
其中一个重要的模块就是ICMP(网络控制报文)协议。
当传送IP数据包发生错误--比如主机不可达,路由不可达等等,ICMP协议将会把错误信息封包,然后传送回给主机。
给主机一个处理错误的机会,这也就是为什么说建立在IP层以上的协议是可能做到安全的原因。
ICMP数据包由8bit的错误类型和8bit的代码和16bit的校验和组成。
而前16bit就组成了ICMP所要传递的信息。
4.3ICMP协议与校验和的计算:
互联网上得操作由路由器紧紧地监控着。
当有异常饭送时候,具体事件通过ICMP报道,如目的不可到达,TTL超时等。
这个协议也用来测试互联网。
每个ICMP消息都封装在IP封包中,所以使用IP寻址,
ICMP消息的格式如下:
首8位表示ICMP的类型,通常可以分为请求消息和错误报告消息两类。
接下来的八位表示ICMP代码,这个域进一步定义了请求或者是消息的类型。
接下来八位表示icmp的校验和。
它提供了ICMP头和他的实际数据。
3.校验和的计算
发送ICMP报文时,必须由程序自己计算校验和,并将它填入ICMP头部的对应域中。
校验和的计算方法是:
将数据以资为单位累加到一个双字中,如果数据长度为奇数,最后一个字节将被扩展到字,累加的结果是一个双字,最后将这个双字的高16bit和低16bit相加后取反,便得到了校验和。
u_shortchecksum(u_short*buffer,intlen)
{
registerintnleft=len;
registeru_short*w=buffer;
registeru_shortanswer;
registerintsum=0;
//使用32位累加器,进行16位的反馈计算
while(nleft>1)
{
sum+=*w++;
nleft-=2;
}
//补全奇数位
if(nleft==1)
{
u_shortu=0;
*(u_char*)(&u)=*(u_char*)w;
sum+=u;
}
//将反馈的16位从高位移到低位
sum=(sum>>16)+(sum&0xffff);
sum+=(sum>>16);
answer=~sum;
return(answer);
}
4.4Ping程序设计思路:
要实现ping程序,需要实现以下步骤:
(1)创建协议类型为IPPROTO_ICMP的原始套接字,设置套接字属性。
(2)创建并初始化ICMP封包。
(3)调用sendto函数向远程主机发送ICMP请求。
(4)调用recfrom函数接受ICMP响应。
初始化ICMP头时先初始化消息类型和代码域,之后是回显请求头。
程序首先定义了ICMP头的数据结构IMCP_HDR.。
ICMP_HDR的定义如下:
typedefstruct_ICMPHeader
{
u_charType;//类型
u_charCode;//代码
u_shortChecksum;//首部校验和
u_shortID;//标识
u_shortSeq;//序列号
charData;//数据
}ICMPHDR,*PICMPHDR;
5、软件设计
编程时,需要用到一些windows函数,说明如下:
(1).intWSAStartup(WORDwVersionRequested,LPWSADATAlpWSAData);
函数说明:
为了在应用程序当中调用任何一个WinsockAPI函数,首先第一件事情就是必须通过WSAStartup函数完成对Winsock服务的初始化,因此需要调用WSAStartup函数。
使用Socket的程序在使用Socket之前必须调用WSAStartup函数。
该函数的第一个参数指明程序请求使用的Socket版本,其中高位字节指明副版本、低位字节指明主版本;
操作系统利用第二个参数返回请求的Socket的版本信息。
当一个应用程序调用WSAStartup函数时,
操作系统根据请求的Socket版本来搜索相应的Socket库,然后绑定找到的Socket库到该应用程序中。
以后应用程序就可以调用所请求的Socket库中的其它Socket函数了。
(2).SOCKETsocket(intaf,inttype,intprotocol);
函数说明:
应用程序调用socket函数来创建一个能够进行网络通信的套接字。
第一个参数指定应用程序使用的通信协议的协议族,对于TCP/IP协议族,该参数置AF_INET;
第二个参数指定要创建的套接字类型,流套接字类型为SOCK_STREAM、数据报套接字类型为SOCK_DGRAM、
原始套接字SOCK_RAW(WinSock接口并不适用某种特定的协议去封装它,而是由程序自行处理数据包以
及协议首部);
第三个参数指定应用程序所使用的通信协议。
(3).intsendto(SOCKETs,constcharFAR*buf,intlen,intflags,conststructsockaddrFAR*to,inttolen);
函数说明:
返回值:
实际发送数据的长度。
parameter:
s套接字
buff待发送数据的缓冲区
size缓冲区长度
Flags调用方式标志位,一般为0,改变Flags,将会改变Sendto发送的形式 addr(可选)指针,指向目的套接字的地址
lenaddr所指地址的长度
(4)intrecvfrom(SOCKETs,charFAR*buf,intlen,intflags,
structsockaddrFAR*from,intFAR*fromlen);
函数说明:
recvfrom()用来接收远程主机经指定的socket传来的数据,并把数据传到由参数buf指向的内存空间,参数len为可接收数据的最大长度.参数flags一般设0,其他数值定义参考recv().参数from用来指定欲传送的网络地址,结构sockaddr请参考bind()函数.参数fromlen为sockaddr的结构长度.
源程序见附页。
流程图:
Ping程序的设计与实现大致可分为四个模块(见图1-1),分别是:
初始化模块、
功能控制模块、ping模块、mian测试模块。
图1-1
5.1初始化模块:
该模块用于定义及初始化各个全局变量,为winsock加载winsock体。
(见图1-2)主要包括定义IP首部格式、定义ICMP首部格式、定义ICMP回应请求、定义ICMP回应答复。
图1-2
5.2功能控制模块:
该模块是被其他模块调用,其功能包括计算校验和、发送回应请求函数、接收应答回复并进行解析、等待回应答复(主是要select模型)。
(见图1-3,1-4,1-5,1-6)
计算校验和函数源码:
图1-3
定义初始化一些变量
接收应答回复
定义初始化一些变量
返回timeout
返回应答时间
调用发送错误函数
RecvEchoRepl
y()开始
检验接收
结果
图1-4
图1-6
是
WaitForEchoR
eply()开始
结束
结束
图1-5
5.3Ping模块功能模块:
该模块是本程序的核心模块,调用其他模块实现其功能,进而实现Ping的功能。
定义初始化各个局部变量
设置目标主机的IP地址,开始ping
发送ICMP回应请求
等待回复的数据
接收回复
计算花费时间
输出平均次数
清除残余
开始
判断
WSAGetLastErr
or()是否调用成功
是
检测目标主机是否为NULL
否
发起四次
ping测试
结束
否
Loop是否
为0
是
s
输出ping结果
调用ping()
释放资源
加载失败
为了实现-t
5.4main函数模块:
向指定的域名或IP地址发送Echo请求报文;根据响应报文显示出Ping的结果;程序仅支持-t选项即可。
开始
WSAStartup
()是否成功
否
截取后三位
字符
结束
图1-8
6、调试过程、实验结果分析
(1)在VC中运行程序后会出现如图4.1所示,提示你输入IP或网址;
图4.1
(2)查看本机的IP配置信息及其含义。
另一种查询IP方式:
命令提示符ipconfig/all——当使用all选项时,IPConfig能为DNS
和WINS服务器显示它已配置且所要使用的附加信息(如IP地址等),并且显示内置于本
地网卡中的物理地址(MAC)。
如果IP地址是从DHCP服务器租用的,IPConfig将显示
DHCP服务器的IP地址和租用地址预计失效的日期。
PhysicalAddress为物理地址,
IPAddress为IP地址,SubnetMask为子码掩码,DefaultGateway为默认网关,DNSServers为DNS服务器地址。
(3)用ping命令测试本机是否可和默认网关连通。
(4)试着使用ping–t命令,如下:
(5)再输入外部网主机命令,看能否ping通.
上图为网络ping通的情形。
(6)再输入校内网命令,看能否ping通。
上图为网络ping通的情形。
7、体会和建议
总的来说,信号与信息处理综合应用设计这么课程还是比较容易的,3道题目在网上的参考资料也很多。
觉得通过这次的课程设计收获不少,发现了自己不足的地方。
找到了
一部分自己应该努力的地方,通过横向比较发现自己和别人有一定差距,有一些是通过学习就能补上的,有一些需要一定的实际联系才能追的上别人。
ping命令是用来查看网络上另一个主机系统的网络连接是否正常的一个工具。
ping命令的工作原理是:
向网络上的另一个主机系统发送ICMP报文,如果指定系统得到了报文,它将把报文一模一样地传回给发送者,这有点象潜水艇声纳系统中使用的发声装置。
在以前的学习中没有接触到这类的函数,通过上网查找才知道是操作系统的类库函数和一些套接字函数。
而且是一些基本的常见的函数,这使我发现自己知识的匮乏,在以后的学习过程中得要好好的努力,多阅读一些复杂的程序,了解一个基本的函数、算法和精良的编程思想,更要多动手写写一些有一定难度的程序,我们不应该怕写程序出错,应该大胆的写出自己的想法,出现错误去解决错误发现自己的错误就能找出自己知识的漏洞和模糊点。
我们还可以通过阅读别人错误的程序,试着帮别人查找错误,这样既能夯实头脑中语言的规则还能发现一些初学者易犯的错误,使自己能少走一些初学者容易走的误区。
本次课程设计较好地实现了要求做到的功能,但同时也遇到不少的困难和挑战。
通过这次设计,不但加深了对Socket的原始套接字编程的理解,经过实现Ping程序,熟悉了IP、ICMP等,掌握TCP/IP网络协议的基本实现方法。
也熟悉了Window网络编程的技术。
能熟悉地使用套接字进行网络通信。
熟悉了数据通信的网络技术,同时学会了跟同学合作交流完成项目的讨论方法和解决问题的能力。
学会如果通过讨论、交流、找资料来独立解决所遇到的问题和不懂。
更多地锻炼了独立解决问题的能力。
8、参考文献
【1】
【2】
【3】
【4】
曹衍龙,刘海英,编著,《VisualC++网络通信编程实用案例精选(第二版)》;2009
程良伦主编,《网络工程概率论》,机械工业出版社,2007
苏峰,黄金双,汤蕾编著,《VisualC++.Net编程