计算机网络课程报告.doc

上传人:飞****2 文档编号:56712335 上传时间:2022-11-03 格式:DOC 页数:18 大小:158.50KB
返回 下载 相关 举报
计算机网络课程报告.doc_第1页
第1页 / 共18页
计算机网络课程报告.doc_第2页
第2页 / 共18页
点击查看更多>>
资源描述

《计算机网络课程报告.doc》由会员分享,可在线阅读,更多相关《计算机网络课程报告.doc(18页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、课程设计(论文)任务书 学院 专业 班一、课程设计(论文)题目计算机网络课程设计 二、课程设计(论文)工作自 2012 年 6 月 日起至 2012 年 6 月 日止。三、课程设计(论文) 地点: 四、课程设计(论文)内容要求:1本课程设计的目的通过课程设计,使学生理论联系实际,在实践中进一步了解计算机网络体系结构,深入理解TCP/IP参考模型,掌握各种网络工程技术和网络规划与设计,初步掌握综合布线技术、高速局域网技术、广域网接入技术、网络互联技术,初步掌握网络应用程序开发技术以及互联网的应用技术。培养学生分析、解决问题的能力,提高学生的科技论文写作能力。2课程设计的任务及要求1)基本要求:(

2、1)熟悉交换机、路由器等网络设备的功能和使用;(2)掌握网络规划与设计,掌握网络安全与管理技术;(3)初步掌握网络应用程序设计技术和互联网应用技术。2)课程设计论文编写要求(1)理论设计部分以课程设计论文的形式提交,格式必须按照课程设计论文标准格式进行书写和装订。(2)课程设计报告(论文)包括目录、绪论、正文、设计小结、参考文献、附录等3)课程设计评分标准: (1)考勤与学习态度:20分(2)理论理解与课程设计报告论文:40分; (3)动手操作与实验设计:20分;(4)设计论文答辩:20分。4)参考文献: (1)计算机网络(第四版)主编:谢希仁 出版社:电子工业出版社 出版时间:2004年7月

3、(2)计算机网络课程设计 主编:吴功宜 胡晓英 张仁 何云 王宁 出版社:机械工业出版社 出版或修订时间:2005年9月(3)计算机网络设计主编:易建勋 出版社:人民邮电出版社 出版或修订时间:2007年10月5)课程设计进度安排内容 天数 地点1选择设计题目、了解设计目的要求、查阅相关理论资料 1天 图书馆、机房2设计方案选型及实验室完成相关的设计任务 2天 实验室 3总结课程设计任务和设计步骤,撰写课程设计论文 2天 图书馆、机房、实验室学生签名: 2012 年6月18日6)选择课程设计题目具体要求:用winsock设计Ping应用程序理解winsock技术网络编程技术,分析PING应用程

4、序设计原理和程序流程,选择合适的开发环境,参考已有的PING程序功能,设计实现ping功能的应用程序。设计论文要求:1) 分析winsock编程技术;2) 分析ping程序的功能及其相关网络协议;3) 给出ping程序流程图和设计方案;4) 选择开发环境,编译源程序;5) 给出软件测试文档;6) 设计小结;7) 参考文献(包括互联网上的引用信息)。课程设计(论文)评审意见(1)考勤与学习态度(20分):优()、良()、中()、一般()、差(); (2)理论理解与课程设计报告论文(40分):优()、良()、中()、一般()、差(); (3)动手操作与实验设计(20分):优()、良()、中()、一

5、般()、差();(4)设计论文答辩(20分):优()、良()、中()、一般()、差();(5)格式规范性及考勤是否降等级:是()、否()评阅人: 职称: 讲 师 2012 年6 月24 日目 录1. 绪 论11.1. 课程设计的目的及意义11.2. 课程设计的任务及要求11.3. 课程设计题目具体要求12. Winsock编程技术22.1. Winsock的基本概念22.2. Winsock编程的特点22.3. Winsock基本的API23. ping程序的功能及其相关网络协议63.1. ping程序的功能63.2. ping的相关协议64. ping程序的设计方案74.1. ping程序的

6、工作流程74.2.选择开发环境,编译源程序85. 软件测试136. 设计小结167. 参考文献171. 绪 论1.1. 课程设计的目的及意义通过课程设计,使学生理论联系实际,在实践中进一步了解计算机网络体系结构,深入理解TCP/IP参考模型,掌握各种网络工程技术和网络规划与设计,初步掌握综合布线技术、高速局域网技术、广域网接入技术、网络互联技术,初步掌握网络应用程序开发技术以及互联网的应用技术。培养学生分析、解决问题的能力,提高学生的科技论文写作能力。1.2. 课程设计的任务及要求1)基本要求:(1)熟悉交换机、路由器等网络设备的功能和使用;(2)掌握网络规划与设计,掌握网络安全与管理技术;(

7、3)初步掌握网络应用程序设计技术和互联网应用技术。2)课程设计论文编写要求(1)理论设计部分以课程设计论文的形式提交,格式必须按照课程设计论文标准格式进行书写和装订。(2)课程设计报告(论文)包括目录、绪论、正文、设计小结、参考文献、附录等1.3. 课程设计题目具体要求用winsock设计Ping应用程序:理解winsock技术网络编程技术,分析PING应用程序设计原理和程序流程,选择合适的开发环境,参考已有的PING程序功能,设计实现ping功能的应用程序。设计论文要求:1) 分析winsock编程技术;2) 分析ping程序的功能及其相关网络协议;3) 给出ping程序流程图和设计方案;4

8、) 选择开发环境,编译源程序;5) 给出软件测试文档;6) 设计小结;7) 参考文献(包括互联网上的引用信息)。2. Winsock编程技术2.1. Winsock的基本概念Socket在英文中是插座的意思,他的设计者实际上是暗指电话插座。因为在Socket环境下编程很像是模拟打电话,Internet的IP地址就是电话号码,要打电话,需要电话插座,在程序中就是向系统申请一个Socket,以后两台机器上的程序“交谈”都是通过这个Socket来进行的。对程序员来说,也可以把Socket看成一个文件指针,只要向指针所指的文件读写数据,就可以实现双向通信。利用Socket进行通信,有两种主要的方式。第

9、一种是面向连接的流方式。顾名思义,在这种方式下,两个通信的应用程序之间要先建立一种连接链路,其过程好像在打电话。一台计算机(电话)要想和另一台计算机(电话)进行数据传输(通话),必须先获得一条链路,只有确定了这条通路之后,数据(通话)才能被正确接受和发送。这种方式对应的是TCP协议。第二种叫做无连接的数据报文方式,这时两台计算机像是把数据放在一个信封里,通过网络寄给对方,信在传输的过程种有可能会残缺不全,而且后发出的信也有可能会先收到,它对应的是UDP协议。流方式的特点是通信可靠,对数据有校验和重发机制,通常用来做数据文件的传输,如FTP、Telnet等;数据报文方式由于取消了重发校验机制,能

10、够打到较高的通信速率,可以用于数据可靠性要求不高的通信,如实时的语音、图像传送和关波消息等。在ISO的OSI网络七层协议中,Winsock主要负责的是控制数据的输入和输出,也就是传输层和网络层。Winsock屏蔽了数据链路层和物理层,它的出现给Windows下的网络编程带来了巨大的变化。2.2. Winsock编程的特点在网络通信中,由于网络拥挤或一次发送的数据量过大等原因,经常会发生交换的数据在短时间内不能传送完,收发数据的函数因此不能返回的现象,这种现象叫做阻塞。Winsock对有可能阻塞的函数提供了两种处理方式阻塞和非阻塞方式。在阻塞方式下,收发数据的函数在被调用后一直要到传送完毕或者出

11、错才能返回;在阻塞期间,除了等待网络操作的完成不能进行任何操作。对于非阻塞方式,函数被调用后立即返回;当网络操作传送完成后,由Winsock给应用程序发送一个消息,通知操作完成,此时可以根据发送的消息的参数判断操作是否正常。在编程时,应尽量使用非阻塞方式。因为在阻塞方式下,用户可能会因为长时间的等待而失去耐心继而关闭应用程序的主窗口,这样当网络操作的函数从Winsock的动态链接库中返回时,主程序已经从内存中删除,可能会造成内存的异常,虽然现在的操作系统已经可以从系统级正确地处理这种内存问题,但还是建议这种情况的发生。2.3. Winsock基本的API(1)WSAStartup():初始化。

12、函数原型:Int PASCALFAR WSAStartup(WORD wVersionRequested,LPWSDATA lpWSAData);Windows Socket由DLL形式提供,为了完成一系列初始化操作,每一个使用Windows Socket的应用程序都必须进行WSASstartup()函数调用,并只有在成功地完成调用之后才能使用Socket。其中参数wVersionRequested表示欲使用的Windows Socket API的版本:这是一个WORD类型的整数,它的高位字节定义是次版本号,低位字节定义的是主版本号。lpWSAData:指向WSADATA资料的指针。成功返回0

13、。(2)socket();创建一个Socket。函数原型:SOCKET socketint af,int type,int proctocol);所有的通信在建立之前都要创建一个Socket,该函数的功能与文件操作中的fopen类似。Af值address family(地址族),一般都填AF_INET,表示是在Internet上的Socket;type是Socket的类型,当采用流连接方式时用SOCK_STREAM,用数据报文方式时用SOCK_DGRAM。Proctocol一般都为0,表示用对两种类型的Socket分别采用缺省的TCP和UDP传输协议。函数的返回值是由Winsock订id一种数

14、据类型SOCKET,它实际上就是个整型数据在Socket创建成功时,代表Winsock分配给程序的Socket编号,后面调用传输函数时,就可以把它像文件指针一样引用。如果Socket建立失败,返回值为INVALID_SOCKET。(3)bind();创建的Socket指定通信对象。函数原型:Int bind(SOCKET s,const struct socket sockaddr_in *addr,int addrlen);创建了Socket之后,就应该选定通信的对象。首先是自己的程序要与网上的哪台计算机通话;其次,在多任务的系统下,该计算机上可能会有几个程序在工作,必须指出要与哪个程序通信

15、。前者可以通过Internet的网络IP地址来确定,而后者是通过端口号来确定。用端口号来表示同一台计算机上不同的应用程序,端口号可以为065536,不同功能的通信程序使用不同的端口号,这样一台计算机上可以有几个程序同时使用一个IP地址通信而不互相干扰,IP地址与端口号的关系好像是电话总机号码与分机号码的关系一样。(4)listen():设置等待连接状态。函数原型:Int listen(SOCKET s,int backlog);对于服务器的程序,当申请到Socket,并指定通信对象为INADDR_ANY之后,就应该等待一个客户机的程序来要求连接。Listen()就是一个把一个Socket设置这

16、种状态的函数。参数backlog是等待连接的队列长度,可取15。如果当某个客户程序要求连接时,服务器已与其他客户程序连接,则后来的连接请求会被放在队列中,等待服务器空闲的时候再与之连接。当队列达到指定的长度(backlog的值)时,再来的连接请求都将被拒绝。(5)accept():接受连接请求。函数原型:SOCKET accept(SOCKET s,struct sockaddr_in *addr,int* addrlen);当没有连接请求时,对于阻塞方式,就进入等待状态,直至有一个请求到达为止。Accept()在接受到连接请求之后,会为这个连接建立一个新的Socket来与对方通信,并把它作为

17、返回值。新建的Socket与原来的Socket有相同的特性,包括端口号。原来的Socket被释放,用于继续等待其他的连接请求,而生成的Socket才是与客户端进行通信的实际Socket。所以一般将参数中的SOCKET称作“监听“Socket,它只负责接受连接,而不负责通话;而对于accept函数返回的SOCKET,把它称作“会话”Socket,它只负责与客户端通话。参数中的指针addr和addlen用来返回客户机的sockaddr-in结构体,够过addr可得到客户机的IP地址和连接端口。注意:bind()、listen()和accept()函数一般都用于服务程序,属于被动等待点函数,要进行主

18、动的连接需要利用connect()函数。函数原型:Int connect(SOCKET s,struct sockaddr_in*name,int namlen)其中s是刚才建立的Socket,name与namelen的含义与使用方法与bind()相同,用来指定通信对象。连接失败该函数会返回SOCKET-ERROR.(6)send()/recv():发送、接收数据。函数原型:Int send(SOCKET s,char*buf,int len,int flags)Int recv(SOCKET s,char*buf,int len,int flags)S是连接用的。Socket、buf和len

19、是发送或接收的的数据包及其长度,参数flags一般取0.recv()函数实际上是读取send()函数发过来的一个数据包。当读到的数据字节少于规定接收的数目时,就把数据全部接收,并返回实际接收到的字节数,当读到的数据多于规定值时,在流方式下剩余的数据由下个recv()读出,在数据报文方式下多余的数据将被丢弃。这两个函数在出错时都返回SOCKET_ERROR。以数据报文方式通信的Socket,由于事先不用建立连接,所以可以跳过connect()而直接用recvfrom和sendto两个函数通信:Int recvfrom(SOCKET s,char*buf,int len,int flags,str

20、uct socket_infrom,int*fromlen);Int sendto(SOCKET s,char*buf,int len,int flags,struct sockaddr_into,int*tolen)其中from、fromlen、to、tolen的含义和用法与bind()和connect()中的相同,分别表示接收和发送数据的对象。(7)closesocket():关闭socket。函数原型:Closesocket(SOCKET s);通信结束,关闭指定的Socket。以上API在调用时的过程如下: Server端 Client端调用WSAStartup()初始化Winsock

21、调用socket创建一个会话socket调用connect()与Server连接调用send()和recv()进行对话调用closesocket()关闭对话调用WSAStartup()初始化Winsock调用socket创建一个监听socket调用bind()为监听socket指定通信对象调用closesocket()关闭对话调用send()和recv()进行对话调用accept()接收连接并生成会话socket调用listen()设定等待连接状态图1 面向连接的流方式过程调用WSAStartup()初始化Winsock调用socket创建一个会话socket调用sendto()和recvfr

22、om()进行通信调用closesocket()关闭socket图2 面向无连接的数据报过程3. ping程序的功能及其相关网络协议3.1. ping程序的功能Ping程序通过主机向远程计算机发出ICMP回显请求,远程计算机拦截这个请求,然后生成一条回显应答消息,通过网络传给主机。但是如果因为一些原因造成不能抵达目标主机,就会生成对应的ICMP错误消息,由原来打算建立通信的那个路径上某处的一个路由器返回。如果与远程主机的物理性连接并不存在问题,但是远程主机已经关机或没有设置对网络时间的做出相应,便需由自己的程序来执行超时检测,侦测出这样的情况。以检查网络是否能够连通,从而可以很好地帮助我们分析判

23、定网络故障。它所利用的原理是这样的:网络上的机器都有唯一确定的IP地址,按照缺省设置,Windows上运行的Ping命令给目标IP地址发送4个ICMP(网间控制报文协议)回送请求,每个32字节数据,如果一切正常,应能得到4个回送应答。根据返回的数据包我们可以确定目标主机的存在以及是否可达。在本程序中,可以通过两种方式测试目标主机的连通性:通过ip地址或者主机名。前者较简单,若通过主机名测试连通性的话,首先要通过数据库中的地址主机名表查询并解析其对应的ip地址,然后进一步测试连通性。如果可以正常连通,则按照先后的顺序返回4个应答帧,显示所用的时间,并且提示完成ping测试。另外还可以通过复选框简

24、单的记录路由器的情况。如果不能正常连通,则显示timeout,并提示测试完成。3.2. ping的相关协议支持Ping的协议中ICMP是最关键的一个。ICMP全称Internet Control Message Protocol(网际控制信息协议)。在网络体系结构的各层次中,都需要控制,而不同的层次有不同的分工和控制内容,IP层的控制功能是最复杂的,主要负责差错控制、拥塞控制等,任何控制都是建立在信息的基础之上的,在基于IP数据报的网络体系中,网关必须自己处理数据报的传输工作,而IP协议自身没有内在机制来获取差错信息并处理。为了处理这些错误,TCP/IP设计了ICMP协议,当某个网关发现传输错

25、误时,立即向信源主机发送ICMP报文,报告出错信息,让信源主机采取相应处理措施,它是一种差错和控制报文协议,不仅用于传输差错报文,还传输控制报文。 ICMP报文包含在IP数据报中,属于IP的一个用户,IP头部就在ICMP报文的前面,所以一个ICMP报文包括IP头部、ICMP头部和ICMP报文,IP头部的Protocol值为1就说明这是一个ICMP报文,ICMP头部中的类型(Type)域用于说明ICMP报文的作用及格式,此外还有一个代码(Code)域用于详细说明某种ICMP报文的类型,所有数据都在ICMP头部后面。 常见的ICMP报文主要有:响应请求目标不可到达、源抑制和超时报文,以及时间戳。4

26、. ping程序的设计方案4.1. ping程序的工作流程设计方案:(1) ping两台主机要发送消息,源主机要有发送区和接收区,因此要为send_buf和recv_buf分配内存;(2) 创建icmp的包头;(3) 编写算法用于计算icmp包的校验和,但在校验之前务必将icmp包头的checksum字段置为0;(4) 初始化raw socket,设置ttl,初始化dest,如果返回值为0表示失败;(5) 初始化icmp的包头,给data部分填充数据,最后计算整个包的检验和;(6) 发送生成的icmp包,返回值小于0,表示失败;(7) 接收icmp包,返回值小于0,表示失败;(8) 对收到的i

27、cmp解码,如果返回值为-2,表示忽略,-1表示失败,0表示成功;(9) 工作结束,显示运行Ping命令的统计结果。4.2. 选择开发环境,编译源程序我选择了VC 6.0 的开发环境,并且创建工程 ping和cpp文件iping.cpp,并由以下代码编译出可执行文件iping.exe。/a progam written by 225#pragma comment(lib,ws2_32.lib)#pragma pack(4) /字节对齐#include winsock2.h#include stdlib.h#include stdio.h#define ICMP_ECHO 8 /ICMP回显请求

28、#define ICMP_ECHOREPLY 0 /ICMP回显应答#define ICMP_MIN 8 /ICMP数据包最短为8个字节/定义IP头部 typedef struct iphdr unsigned int h_len:4; / 头部长 unsigned int version:4; / 版本号unsigned char tos; / 服务类型 unsigned short ident; / 标识 unsigned short total_len; / 总长度unsigned short frag_and_flags; /标志unsigned char ttl; /生存时间unsi

29、gned char proto; / 上层协议 unsigned short checksum; / 校验和unsigned int sourceIP; /源IPunsigned int destIP; /目的IPIpHeader; / 定义ICMP 头部 typedef struct icmphdr BYTE i_type; /类型BYTE i_code; /代码USHORT i_cksum; /校验和USHORT i_id; /标识USHORT i_seq; /序列号ULONG timestamp; /数据IcmpHeader; #define STATUS_FAILED 0xFFFF #

30、define DEF_PACKET_SIZE 32 /默认数据包长度#define DEF_PACKET_NUMBER 4 /默认发送ICMP请求的次数#define MAX_PACKET 1024 /数据包最大长度#define xmalloc(s) HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(s) /分配内存#define xfree(p) HeapFree (GetProcessHeap(),0,(p) /释放内存/填充icmp数据包void fill_icmp_data(char *, int); /计算校验和USHORT checksum

31、(USHORT *, int); /收到数据后解码int decode_resp(char *,int ,struct sockaddr_in *); /提示用户该程序使用方法void Usage(char *progname) fprintf(stderr,t命令所在目录:n); fprintf(stderr,t%s n,progname); printf(t你需要在cmd中进入该目录直接使用iping指令,例如:iping n);ExitProcess(STATUS_FAILED); int main(int argc, char *argv) system(cls);printf(nnn

32、=A small program writen by XXXXXXXX=n);WSADATA wsaData; /初始化windows socket需要的参数SOCKET sockRaw; /原始套接字struct sockaddr_in dest,from; /源、目的IP地址struct hostent * hp; /指针指向包含主机名、地址列表等信息的结构体int bread,datasize,times; int fromlen = sizeof(from); int timeout = 1000; /超时时间1000msint statistic = 0; / 用于统计 char *

33、dest_ip; char *icmp_data; char *recvbuf; unsigned int addr=0; USHORT seq_no = 0; if (WSAStartup(MAKEWORD(2,1),&wsaData) != 0) fprintf(stderr,WSAStartup failed: %dn,GetLastError();ExitProcess(STATUS_FAILED); /使用方法不对时显示提示信息if (argc h_addr,hp-h_length); else dest.sin_addr.s_addr = addr; /协议族if (hp) des

34、t.sin_family = hp-h_addrtype; else dest.sin_family = AF_INET; /目标IPdest_ip = inet_ntoa(dest.sin_addr); /除了目标地址,还给出了Ping的次数if(argc2)times=atoi(argv2);if(times = 0) times=DEF_PACKET_NUMBER;else times=DEF_PACKET_NUMBER;/还给出了数据大小if (argc 3) datasize = atoi(argv3); /给的是0,则用默认数据包大小if (datasize = 0) datasi

35、ze = DEF_PACKET_SIZE;/用户给出的数据包大小太大if (datasize 1024) fprintf(stderr,WARNING : data_size is too large !n);datasize = DEF_PACKET_SIZE; else datasize = DEF_PACKET_SIZE; datasize += sizeof(IcmpHeader); icmp_data = (char*)xmalloc(MAX_PACKET); recvbuf = (char*)xmalloc(MAX_PACKET); if (!icmp_data) fprintf(

36、stderr,HeapAlloc failed %dn,GetLastError(); ExitProcess(STATUS_FAILED); memset(icmp_data,0,MAX_PACKET); /填充ICMP数据包,类型、代码、标识等fill_icmp_data(icmp_data,datasize); /提示正在ping目标主机fprintf(stdout,nPinging %s .nn,dest_ip);/Ping多次for(int i=0;ii_cksum = 0; /取得以毫秒为单位的计算机启动后经历的时间间隔(IcmpHeader*)icmp_data)-timesta

37、mp = GetTickCount(); (IcmpHeader*)icmp_data)-i_seq = seq_no+; /序列号递增(IcmpHeader*)icmp_data)-i_cksum = checksum(USHORT*)icmp_data,datasize);/计算校验和/发送ICMP数据包bwrote = sendto(sockRaw,icmp_data,datasize,0,(struct sockaddr*)&dest,sizeof(dest); /发送失败if (bwrote = SOCKET_ERROR) if (WSAGetLastError() = WSAETI

38、MEDOUT) printf(Request timed out.n); continue; fprintf(stderr,sendto failed: %dn,WSAGetLastError(); ExitProcess(STATUS_FAILED); if (bwrote datasize ) fprintf(stdout,Wrote %d bytesn,bwrote); /接收应答数据bread = recvfrom(sockRaw,recvbuf,MAX_PACKET,0,(struct sockaddr*)&from,&fromlen); /接收失败if (bread = SOCKE

39、T_ERROR) if (WSAGetLastError() = WSAETIMEDOUT) printf(Request timed out.n); continue; fprintf(stderr,recvfrom failed: %dn,WSAGetLastError(); ExitProcess(STATUS_FAILED); /成功解码if(!decode_resp(recvbuf,bread,&from)statistic+; /记录成功接收响应数据包的次数Sleep(1000); /统计运行Ping命令的统计结果fprintf(stdout,nPing statistics for %s n,dest_ip);fprintf(stdout, Packets: Sent = %d,Received = %d, Lost = %d (%2.0f% loss)n,times,statistic,(times-statistic),(float)(times-statistic)/times*100);printf(n=A small program writen by XXXXXXXX=n); WSACleanup();return 0; /收到响应IP数据包后,对其进行解码int decode_resp(char *buf, int bytes,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁