计算机网络课程设计由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“计算机网络课程设计题”。
课程设计(论文)任务书
信息工程 学院
计算机应用 专业 计算机2010-1 班
一、课程设计(论文)题目 计算机网络课程设计
二、课程设计(论文)工作自 2012 年 6 月 18 日起至 2012 年 6 月 22 日止。
三、课程设计(论文)地点: 创新大楼405有线网络实验室。
四、课程设计(论文)内容要求: 1.本课程设计的目的通过课程设计,使学生理论联系实际,在实践中进一步了解计算机网络体系结构,深入理解TCP/IP参考模型,掌握各种网络工程技术和网络规划与设计,初步掌握综合布线技术、高速局域网技术、广域网接入技术、网络互联技术,初步掌握网络应用程序开发技术以及互联网的应用技术。培养学生分析、解决问题的能力,提高学生的科技论文写作能力。2.课程设计的任务及要求 1)基本要求:
(1)熟悉交换机、路由器等网络设备的功能和使用;(2)掌握网络规划与设计,掌握网络安全与管理技术;(3)初步掌握网络应用程序设计技术和互联网应用技术。2)课程设计论文编写要求
(1)理论设计部分以课程设计论文的形式提交,格式必须按照课程设计论文标准格式进行书写和装订。
(2)课程设计报告(论文)包括目录、绪论、正文、设计小结、参考文献、附录等
3)课程设计评分标准:
(1)考勤与学习态度:20分
(2)理论理解与课程设计报告论文:40分;
(3)动手操作与实验设计:20分;
(4)设计论文答辩:20分。4)参考文献:
(1)《计算机网络(第5版)》,谢希仁主编,电子工业出版社出版
(2)《windows网络编程技术》,胡鸣主编,科学出版社出版
(3)网上百度 5)课程设计进度安排
内容 天数 地点
1.选择设计题目、了解设计目的要求、查阅相关理论资料 1天 图书馆、机房
2.设计方案选型及实验室完成相关的设计任务 2天 实验室 3.总结课程设计任务和设计步骤,撰写课程设计论文 2天 图书馆、机房、实验室
学生签名:
2012 年6月18日
6)选择课程设计题目具体要求: 用winsock设计Ping应用程序
具体要求:
理解winsock技术网络编程技术,分析PING应用程序设计原理和程序流程,选择合适的开发环境,参考已有的PING程序功能,设计实现ping功能的应用程序。设计论文要求:
1)分析winsock编程技术;
2)分析ping程序的功能及其相关网络协议; 3)给出ping程序流程图和设计方案; 4)选择开发环境,编译源程序; 5)给出软件测试文档; 6)设计小结;
参考文献(包括互联网上的引用信息)。
课程设计(论文)评审意见
(1)考勤与学习态度(20分):优()、良()、中()、一般()、差();
(2)理论理解与课程设计报告论文(40分):优()、良()、中()、一般()、差();
(3)动手操作与实验设计(20分):优()、良()、中()、一般()、差();
(4)设计论文答辩(20分):优()、良()、中()、一般()、差();(5)格式规范性及考勤是否降等级:是()、否()
评阅人:
职称: 讲 师
2012 年6 月24 日
目录
一、目的和意义以及发展现状和趋势..........................1
二、课程设计具体要求......................................2
三、winsock编程技术.......................................3
四、ping程序的功能及其相关网络协议........................6
五、ping程序流程图和设计方案..............................7
六、开发环境..............................................9
七、源程序...............................................10
八、软件测试.............................................22
九、总结与心得...........................................24
十、参考文献.............................................25
一、目的和意义以及发展现状和趋势
目的: 通过课程设计,使学生理论联系实际,在实践中进一步了解计算机网络体系结构,深入理解,TCP/IP参考模型,掌握各种网络工程技术和网络规划与设计,初步掌握综合布线技术、高速局域网技术、广域网接入技术、网络互联技术,初步掌握网络应用程序开发技术以及互联网的应用技术。培养学生分析、解决问题的能力,提高学生的科技论文写作能力。
意义:在进行本课程设计题目后,能初步掌握PING程序的设计原理及实现过程,了解网络的连通性概念,了解winsock网络编程的概念并能实现简单的网络应用程序设计与实现。
发展现状和趋势:ping命令是用来检查网络是否能够连通,用它可以很好地帮助我们分析判定网络故障,并且是windows等系统自带的程序,大多数上网用户都会使用该功能,其发展现状良好,是目前使用特别多的一个工具,估计这也将成为未来的发展的趋势。
二、课程设计具体要求 用winsock设计Ping应用程序 具体要求:
理解winsock技术网络编程技术,分析PING应用程序设计原理和程序流程,选择合适的开发环境,参考已有的PING程序功能,设计实现ping功能的应用程序。
设计论文要求:
7)分析winsock编程技术;
8)分析ping程序的功能及其相关网络协议; 9)给出ping程序流程图和设计方案; 10)选择开发环境,编译源程序; 11)给出软件测试文档; 12)设计小结;
参考文献(包括互联网上的引用信息)。
三、winsock编程技术
使用WinSock API的编程,应该了解TCP/IP的基础知识。虽然你可以直接使用WinSock API来写网络应用程序,但是,要写出优秀的网络应用程序,还是必须对TCP/IP协议有一些了解的。
1.TCP/IP协议与WinSock网络编程接口的关系
WinSock 并不是一种网络协议,它只是一个网络编程接口,也就是说,它不是协议,但是它可以访问很多种网络协议,你可以把他当作一些协议的封装。现在的 WinSock已经基本上实现了与协议无关。你可以使用WinSock来调用多种协议的功能。那么,WinSock和TCP/IP协议到底是什么关系呢?实际上,WinSock就是TCP/IP协议的一种封装,你可以通过调用WinSock的接口函数来调用TCP/IP的各种功能.例如我想用TCP/IP 协议发送数据,你就可以使用WinSock的接口函数Send()来调用TCP/IP的发送数据功能,至于具体怎么发送数据,WinSock已经帮你封装好了这种功能。
2、TCP/IP协议介绍
TCP/IP协议包含的范围非常的广,他是一种四层协议,包含了各种硬件、软件需求的定义。TCP/IP协议确切的说法应该是TCP/UDP/IP协议。UDP协议(User Datagram Protocol 用户数据报协议),是一种保护消息边界的,不保障可靠数据的传输。TCP协议(Transmiion Control Protocol 传输控制协议),是一种流传输的协议。他提供可靠的、有序的、双向的、面向连接的传输。保护消息边界,就是指传输协议把数据当作一条独立的消息在网上传输,接收端只能接收独立的消息。也就是说存在保护消息边界,接收端一次只能接收发送端发出的一个数据包。
而面向流则是指无保护消息保护边界的,如果发送端连续发送数据,接收端有可能在一次接收动作中,会接收两个或者更多的数据包。3.WinSock编程简单流程
WinSock编程分为服务器端和客户端两部分,TCP服务器端的大体流程如下:
对于任何基于WinSock的编程首先必须要初始化WinSock DLL库。int WSAStarup(WORD wVersionRequested,LPWSADATA lpWsAData)。wVersionRequested是我们要求使用的WinSock的版本。调用这个接口函数可以初始化WinSock。
然后必须创建一个套接字(Socket)。
SOCKET Socket(int af,int type,int protocol);套接字可以说是WinSock通讯的核心。WinSock通讯的所有数据传输,都是通过 3 套接字来完成的,套接字包含了两个信息,一个是IP地址,一个是Port端口号,使用这两个信息,就可以确定网络中的任何一个通讯节点。
当调用了Socket()接口函数创建了一个套接字后,必须把套接字与你需要进行通讯的地址建立联系,可以通过绑定函数来实现
int bind(SOCKET s,const struct sockaddr FAR* name,int namelen);struct sockaddr_in{ short sin_family;u_short sin_prot;struct in_addr sin_addr;char sin_sero[8];} 就包含了需要建立连接的本地的地址,包括地址族、IP和端口信息。sin_family字段必须把它设为AF_INET,这是告诉WinSock使用的是IP地址族。sin_prot就是要用来通讯的端口号。sin_addr就是要用来通讯的IP地址信息。WinSock API提供了几个函数。把主机字节转化成网络字节的函数;u_long htonl(u_long hostlong);u_short htons(u_short hostshort);把网络字节转化成主机字节的函数;u_long ntohl(u_long netlong);u_short ntohs(u_short netshort);这样,设置IP地址和port端口时,就必须把主机字节转化成网络字节后,才能用Bind()函数来绑定套接字和地址。
当绑定完成之后,服务器端必须建立一个监听的队列来接收客户端的连接请求。int listen(SOCKET s,int backlog);这个函数可以把套接字转成监听模式。如果客户端有了连接请求,我们还必须使用
int accept(SOCKET s,struct sockaddr FAR* addr,int FAR* addrlen);来接受客户端的请求。
现在基本上已经完成了一个服务器的建立,而客户端的建立的流程则是初始化WinSock,然后创建Socket套接字,再使用
int connect(SOCKET s,const struct sockaddr FAR* name,int namelen);来连接服务端。4.WinSock编程的模型
上面介绍的仅仅是最简单的WinSock通讯的方法,而实际中很多网络通讯的却很多难以解决的意外情况。
例如,WinSock提供了两种套接字模式:锁定和非锁定。当使用锁定套接字的时候,使用的很多函数,例如accpet、send、recv等等,如果没有数据需要处理,这些函数都不会返回,也就是说,你的应用程序会阻塞在那些函数的调用处。而如果使用非阻塞模式,调用这些函数,不管你有没有数据到达,他都会返回。所以有可能我们在非阻塞模式里,调用这些函数大部分的情况下会返回失败,所以就需要我们来处理很多的意外出错。
这显然不是我们想要看到的情况。我们可以采用WinSock的通讯模型来避免这些情况的发生。
WinSock提供了五种套接字I/O模型来解决这些问题。他们分别是select(选择),WSAAsyncSelect(异步选择),WSAEventSelect(事件选择,overlapped(重叠),completion port(完成端口)。
这里详细介绍一下select,WSAASyncSelect两种模型。Select模型是最常见的I/O模型。使用
int select(int nfds , fd_set FAR* readfds , fd_set FAR* writefds,fd_set FAR* exceptfds,const struct timeval FAR * timeout);函数来检查你要调用的Socket套接字是否已经有了需要处理的数据。select包含三个Socket队列,分别代表:
readfds,检查可读性,writefds,检查可写性,exceptfds,例外数据。timeout是select函数的返回时间。
WSAAsyncSelect(异步选择)模型:WSAASyncSelect模型就是把一个窗口和套接字句柄建立起连接,套接字的网络事件发生时时候,就会把某个消息发送到窗口,然后可以在窗口的消息响应函数中处理数据的接收和发送。
int WSAAsyncSelect(SOCKET s, HWND hWnd , unsigned int wMsg , long lEvent);这个函数可以把套接字句柄和窗口建立起连接,wMsg 是我们必须自定义的一个消息。
四、ping程序的功能及其相关网络协议
1、Ping程序功能
它主要的功能是用来检测网络的连通情况和分析网络速度。
Ping程序通过主机向远程计算机发出ICMP回显请求,远程计算机拦截这个请求,然后生成一条回显应答消息,通过网络传给主机。但是如果因为一些原因造成不能抵达目标主机,就会生成对应的ICMP错误消息,由原来打算建立通信的那个路径上某处的一个路由器返回。如果与远程主机的物理性连接并不存在问题,但是远程主机已经关机或没有设置对网络时间的做出相应,便需由自己的程序来执行超时检测,侦测出这样的情况。以检查网络是否能够连通,从而可以很好地帮助我们分析判定网络故障。
它所利用的原理:网络上的机器都有唯一确定的IP地址,按照缺省设置,Windows上运行的Ping命令给目标IP地址发送4个ICMP(网间控制报文协议)回送请求,每个32字节数据,如果一切正常,应能得到4个回送应答。根据返回的数据包我们可以确定目标主机的存在以及是否可达。
在本程序中,可以通过两种方式测试目标主机的连通性:通过ip地址或者主机名。前者较简单,若通过主机名测试连通性的话,首先要通过数据库中的地址主机名表查询并解析其对应的ip地址,然后进一步测试连通性。如果可以正常连通,则按照先后的顺序返回4个应答帧,显示所用的时间,并且提示完成ping测试。如果不能正常连通,则显示Unknow host+地址,并提示测试完成。
2、Ping的协议
支持Ping的协议中ICMP是最关键的一个。ICMP全称Internet Control Meage Protocol(网际控制信息协议)。在网络体系结构的各层次中,都需要控制,而不同的层次有不同的分工和控制内容,IP层的控制功能是最复杂的,主要负责差错控制、拥塞控制等,任何控制都是建立在信息的基础之上的,在基于IP数据报的网络体系中,网关必须自己处理数据报的传输工作,而IP协议自身没有内在机制来获取差错信息并处理。为了处理这些错误,TCP/IP设计了ICMP协议,当某个网关发现传输错误时,立即向信源主机发送ICMP报文,报告出错信息,让信源主机采取相应处理措施,它是一种差错和控制报文协议,不仅用于传输差错报文,还传输控制报文。
ICMP报文包含在IP数据报中,属于IP的一个用户,IP头部就在ICMP报文的前面,所以一个ICMP报文包括IP头部、ICMP头部和ICMP报文,IP头部的Protocol值为1就说明这是一个ICMP报文,ICMP头部中的类型(Type)域用于
说明ICMP报文的作用及格式,此外还有一个代码(Code)域用于详细说明某种ICMP报文的类型,所有数据都在ICMP头部后面。
常见的ICMP报文主要有:响应请求目标不可到达、源抑制和超时报文,以 及时间戳。6
五、ping程序流程图和设计方案
1、Ping请求程序流程图
2、Ping回应程序流程图
3、接收数据包流程图
六、开发环境
1、C语言简介
C语言是一种计算机程序设计语言。它既具有高级语言的特点,又具有汇编语言的特点。它由美国贝尔研究所的D.M.Ritchie于1972年推出。1978后,C语言已先后被移植到大、中、小及微型机上。它可以作为工作系统设计语言,编写系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。它的应用范围广泛,具备很强的数据处理能力,不仅仅是在软件开发上,而且各类科研都需要用到C语言,适于编写系统软件,三维,二维图形和动画。具体应用比如单片机以及嵌入式系统开发。
2、C语言特点
C是高级语言。它把高级语言的基本结构和语句与低级语言的实用性结合起来。C 语言可以像汇编语言一样对位、字节和地址进行操作,而这三者是计算机最基本的工作单元。
C是结构式语言。结构式语言的显著特点是代码及数据的分隔化,即程序的各个部分除了必要的信息交流外彼此独立。这种结构化方式可使程序层次清晰,便于使用、维护以及调试。C 语言是以函数形式提供给用户的,这些函数可方便的调用,并具有多种循环、条件语句控制程序流向,从而使程序完全结构化。
C语言功能齐全。具有各种各样的数据类型,并引入了指针概念,可使程序效率更高。而且计算功能、逻辑判断功能也比较强大,可以实现决策目的的游戏。
C语言适用范围大。适合于多种操作系统,如Windows、DOS、UNIX等等;也适用于多种机型。
C语言对编写需要硬件进行操作的场合,明显优于其它高级语言,有一些大型应用软件也是用C语言编写的。
七、源程序
/*ping源文件*/
#pragma comment(lib, “ws2_32.lib”)
#include #include #include #include #include
#define IP_RECORD_ROUTE 0x7
#define DEF_PACKET_SIZE 32
#define MAX_PACKET
1024
#define MAX_IP_HDR_SIZE 60
#define ICMP_ECHO
#define ICMP_ECHOREPLY
0
#define ICMP_MIN
void InitPing();void UserHelp();
void GetArgments(int argc, char** argv);
USHORT CheckSum(USHORT *buffer, int size);void FillICMPData(char *icmp_data, int datasize);void FreeRes();
void DecodeIPOptions(char *buf, int bytes);void DecodeICMPHeader(char *buf, int bytes, SOCKADDR_IN* from);
void PingTest(int timeout);
typedef struct _iphdr
//定义IP报头结构体 { 10 unsigned int h_len:4;/*表示IP报头长度,首部长度指的是首部占32bit字的数目,包括任何选项。由于它是一个4bit 字段,因此首部最长为60个字节,不包括任何选项的IP报头是20个字节。*/
unsigned int version:4;// 表示IP的版本号,这里表示Ipv4 unsigned char tos;/*表示服务的类型,可以表示最小时延,最大吞吐量,最高可靠性和最小费用。*/ unsigned short total_len;//整个IP数据报的总长度
unsigned short ident;//唯一的标识符,标识主机发送的每一份数据报 unsigned short frag_flags;//分段标志,表示过长的数据报是否要分段 unsigned char ttl;//生存期,表示数据报可以经过的最多路由器数 unsigned char proto;//协议类型(TCP、UDP等)unsigned short checksum;//校验和 unsigned int sourceIP;//源IP地址 unsigned int destIP;//目的IP地址 } IpHeader;
typedef struct _icmphdr
//定义ICMP报文结构体 {
BYTE
i_type;
//ICMP报文类型
BYTE
i_code;
// 该类型中的代码号,一种ICMP 报文的类型号和该类型中的代码号共同决定
USHORT i_cksum;
// 校验和
USHORT i_id;
USHORT i_seq;
// 序列号,序列号从0开始,每发送一次新的回显请求就加1
ULONG timestamp;
// 时间
} IcmpHeader;
typedef struct _ipoptionhdr
//定义IP选项结构体 {
unsigned char code;
// 指明IP 选项类型,对于路由记录选项,它的值是7
unsigned char len;
// 选项头长度
unsigned char ptr;
// 地址指针字段,是一个基于1的指针,指向存放下一个IP地址的位置
unsigned long addr[9];
//记录的Ip地址列表,由于IP首部中选项的空间有限,所以可以记录的Ip地址最多是9个 } IpOptionHeader;
SOCKET m_socket;IpOptionHeader IpOption;SOCKADDR_IN DestAddr;SOCKADDR_IN SourceAddr;
char *icmp_data;char *recvbuf;USHORT seq_no;char *lpdest;int datasize;BOOL RecordFlag;double PacketNum;BOOL SuceFlag;
void InitPing()
//初始化ping 所需的全局变量,为各个变量赋初始值 {
WSADATA wsaData;
icmp_data = NULL;
seq_no = 0;
recvbuf = NULL;
RecordFlag = FALSE;
lpdest = NULL;
datasize = DEF_PACKET_SIZE;
PacketNum = 5;
SuceFlag = FALSE;
if(WSAStartup(MAKEWORD(2, 2), &wsaData)!= 0)
{
printf(“WSAStartup()failed: %dn”, GetLastError());
return;
}
m_socket = INVALID_SOCKET;}
void UserHelp()
//显示用户帮助信息 { printf(“请到cmd命令提示符上操作!n”);printf(“UserHelp: ping-r [data size]n”);
printf(“
-r
record routen”);
printf(“
-n
record amountn”);
printf(“
host
remote machine to pingn”);
printf(“
datasize
can be up to 1KBn”);
ExitProce(-1);}
void GetArgments(int argc,char** argv)
//获取用户提交的参数 {
int i;
int j;
int exp;
int len;
int m;
if(argc == 1)
{
printf(“nPlease specify the destination IP addre and the ping option as follow!n”);
UserHelp();
}
for(i = 1;i
{
len = strlen(argv[i]);
if(argv[i][0] == '-')
{
if(isdigit(argv[i][1]))
{
PacketNum = 0;
for(j=len-1,exp=0;j>=1;j--,exp++)
PacketNum +=((double)(argv[i][j]-48))*pow(10,exp);
}
else
{
switch(tolower(argv[i][1]))
{
case 'r':
RecordFlag = TRUE;
break;
default:
UserHelp();break;
}
}
}
else if(isdigit(argv[i][0]))
{
for(m=1;m
{
if(!(isdigit(argv[i][m])))
{
lpdest = argv[i];
break;
}
else if(m==len-1)
datasize = atoi(argv[i]);
}
}
else
lpdest = argv[i];
} }
USHORT CheckSum(USHORT *buffer, int size){
unsigned long cksum=0;
while(size > 1)
{
cksum += *buffer++;
size-= sizeof(USHORT);
}
if(size)
{
cksum += *(UCHAR*)buffer;
}
cksum =(cksum >> 16)+(cksum & 0xffff);
cksum +=(cksum >>16);
return(USHORT)(~cksum);}
void FillICMPData(char *icmp_data, int datasize)字段 {
//计算校验和
//填充ICMP数据报中各个
IcmpHeader *icmp_hdr = NULL;
char
*datapart = NULL;
icmp_hdr =(IcmpHeader*)icmp_data;
icmp_hdr->i_type = ICMP_ECHO;
icmp_hdr->i_code = 0;
icmp_hdr->i_id =(USHORT)GetCurrentProceId();
icmp_hdr->i_cksum = 0;
icmp_hdr->i_seq = 0;
datapart = icmp_data + sizeof(IcmpHeader);
memset(datapart,'0',datasize-sizeof(IcmpHeader));}
void FreeRes()
//释放占用的资源,包括关闭初始化socket 调用的函数的、关闭创建的socket和释放分配的内存等。{
if(m_socket!= INVALID_SOCKET)
closesocket(m_socket);
HeapFree(GetProceHeap(), 0, recvbuf);
HeapFree(GetProceHeap(), 0, icmp_data);
WSACleanup();
return;}
void DecodeIPOptions(char *buf, int bytes)
//解读IP选项,从中读出从源主机到目的主机经过的路由,并输出路由信息 {
IpOptionHeader *ipopt = NULL;
IN_ADDR inaddr;
int i;HOSTENT *host = NULL;
ipopt =(IpOptionHeader *)(buf + 20);
printf(“RR:
”);
for(i = 0;i ptr / 4)icmphdr->timestamp);
printf(“n”);
icmpcount++;
return;}
void PingTest(int timeout)
//进行Ping操作 {
int ret;
int readNum;
int fromlen;
struct hostent *hp = NULL;
m_socket = WSASocket(AF_INET, SOCK_RAW, IPPROTO_ICMP, 0,WSA_FLAG_OVERLAPPED);
if(m_socket == INVALID_SOCKET)
{
printf(“WSASocket()failed: %dn”, WSAGetLastError());
NULL,return;
}
if(RecordFlag)
{
ZeroMemory(&IpOption, sizeof(IpOption));
IpOption.code = IP_RECORD_ROUTE;
IpOption.ptr = 4;
IpOption.len = 39;
ret = setsockopt(m_socket, IPPROTO_IP, IP_OPTIONS,(char *)&IpOption, sizeof(IpOption));
if(ret == SOCKET_ERROR)
{
printf(“setsockopt(IP_OPTIONS)failed: %dn”,WSAGetLastError());
}
}
readNum = setsockopt(m_socket, SOL_SOCKET, SO_RCVTIMEO,(char*)&timeout, sizeof(timeout));
if(readNum == SOCKET_ERROR)
{
printf(“setsockopt(SO_RCVTIMEO)failed: %dn”,WSAGetLastError());
return;
}
timeout = 1000;
readNum = setsockopt(m_socket, SOL_SOCKET, SO_SNDTIMEO,(char*)&timeout, sizeof(timeout));
if(readNum == SOCKET_ERROR)
{
printf(“setsockopt(SO_SNDTIMEO)failed: %dn”,WSAGetLastError());
return;
}
memset(&DestAddr, 0, sizeof(DestAddr));
DestAddr.sin_family = AF_INET;
if((DestAddr.sin_addr.s_addr = inet_addr(lpdest))== INADDR_NONE)
{
if((hp = gethostbyname(lpdest))!= NULL)
{
memcpy(&(DestAddr.sin_addr), hp->h_addr, hp->h_length);
DestAddr.sin_family = hp->h_addrtype;
printf(“-------华东交通大学信息学院20100610040104------------------n”);
printf(“DestAddr.sin_addr = %sn”, inet_ntoa(DestAddr.sin_addr));
}
else
{
printf(“gethostbyname()failed: %dn”,WSAGetLastError());
return;
}
}
datasize += sizeof(IcmpHeader);
icmp_data =(char*)HeapAlloc(GetProceHeap(),HEAP_ZERO_MEMORY,MAX_PACKET);
recvbuf =(char*)HeapAlloc(GetProceHeap(), HEAP_ZERO_MEMORY,MAX_PACKET);
if(!icmp_data)
{
printf(“HeapAlloc()failed: %dn”, GetLastError());
return;
}
memset(icmp_data,0,MAX_PACKET);
FillICMPData(icmp_data,datasize);
while(1){
static int nCount = 0;
int writeNum;
if(nCount++ == PacketNum)
break;
((IcmpHeader*)icmp_data)->i_cksum = 0;
((IcmpHeader*)icmp_data)->timestamp = GetTickCount();
((IcmpHeader*)icmp_data)->i_seq = seq_no++;
((IcmpHeader*)icmp_data)->i_cksum = CheckSum((USHORT*)icmp_data, datasize);
writeNum = sendto(m_socket, icmp_data, datasize, 0,(struct sockaddr*)&DestAddr, sizeof(DestAddr));
if(writeNum == SOCKET_ERROR)
{
if(WSAGetLastError()== WSAETIMEDOUT)
{
printf(“timed outn”);
continue;
}
printf(“sendto()failed: %dn”, WSAGetLastError());
return;
}
fromlen = sizeof(SourceAddr);
readNum = recvfrom(m_socket, recvbuf, MAX_PACKET, 0,(struct sockaddr*)&SourceAddr, &fromlen);
if(readNum == SOCKET_ERROR)
{
if(WSAGetLastError()== WSAETIMEDOUT)
{
printf(“timed outn”);
continue;
}
printf(“recvfrom()failed: %dn”, WSAGetLastError());
return;
}
DecodeICMPHeader(recvbuf, readNum, &SourceAddr);
} } int main(int argc, char* argv[]){
InitPing();
GetArgments(argc, argv);
PingTest(1000);
Sleep(1000);
if(SuceFlag){
printf(“-------华东交通大学信息学院20100610040104------------------n”);
printf(“nPing end, you got %.0f record!n”,PacketNum);
printf(“nplease pre enter if you want to ping againn”);}
else
printf(“Ping end,no record!”);
FreeRes();
getchar();
return 0;
}
八、软件测试
九、总结与心得
一个星期结束了,不敢说自己有多大的进步,获得了多少知识,但起码对网路有了进一步的了解。通过这次课程设计发现这其中需要的很多知识我们没有接触过,去图书馆查资料的时候发现我们课堂上学到的仅仅是皮毛,还有很多我们需要掌握的知识。同时也发现有很多我们学过的东西并没有理解到位,不能灵活运用于实际,不能很好的用来解决问题,这就需要我们不断地大量的实践,通过不断的自学,不断的发现问题,思考问题,进而解决问题。在这个过程中,我们将深刻理解所学知识,也可以学到不少很实用的知识。比如了解了ping命令实际上是向你要访问的目的地主机发送一个ICMP数据包,如果网络连通良好,目的主机收到该数据包后,会返回一个同样大小的ICMP数据包,通过返回的数据包里面的内容,你可以了解很多东西,如往返时间、TTL、目的地址的IP地址、目的地主机所使用的操作系统、所经过的路由数等等,我的实验里由于时间较短、只设计了能查看往返时间、TTL、目的地址的IP地址这些信息。
阅读各种文档,很多东西写的思路清晰,貌似看着也很简单,但真正需要自己想办法去设计一个时才发现其中的难度。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。
不管做什么,我们都要相信自己,不能畏惧,不能怕遇到困难,什么都需要去尝试,有些你开始认为很难的事在你尝试之后你可能会发现原来它并没有自己以前觉得的那样难,自己也是可以的。
十、参考文献
(1)《计算机网络(第5版)》,谢希仁主编,电子工业出版社出版
(2)《windows网络编程技术》,胡鸣主编,科学出版社出版
(3)网上百度