当前位置:文档之家› 计算机网络课程设计实验报告

计算机网络课程设计实验报告

计算机网络课程设计报告姓名:王齐学号:1105010404班级:计算机四班指导老师:张会福湖南科技大学计算机科学与工程学院2014年02月实验一:一、设计题目网络聊天程序的设计与实现二、实验目的1、加深对计算机网络通信系统工作原理的理解通过编写计算机程序实现、模拟网络的某些功能,使自己理解并掌握计算机网络基本工作原理及过程。

2、提高网络编程和应用的能力提高实际编程能力和灵活运用所学知识解决问题的能力。

培养调查研究、查阅技术文献、资料、手册及编写技术文档的能力,理论运用于实践的能力。

三、课程设计要求1、仔细分析每一个实验的具体内容、步骤和要求,按设计要求完成任务。

2、程序设计需要完成的程序流程图、说明文档和源程序清单。

3、提交课程设报告(包含课程设计名称、课程设计题目、课程设计内容、课程设计步骤、调试过程、课程设计结果以及结果分析、心得体会)、程序源文件、可执行文件。

四、程序原理在计算机通信系统中,有两种通信方式:面向连接的TCP和面向报文的UDP。

TCP:传输控制协议。

TCP提供可靠交付的服务。

也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复、并且按序到达。

所以服务器和客户端的通讯使用TCP来完成。

确保服务器作为“中转站”能够得到、存储、转发正确的客户信息。

UDP:用户数据报协议。

UDP用来支持那些需要在计算机之间传输数据的网络应用。

包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。

因为客户端之间的通讯(聊天)对数据正确性的要求不是太高,偶尔出错也不会有太大的影响。

本课程设计采用TCP方式来实现网络聊天程序。

五、课程设计步骤1、TCP网络聊天程序TCP传输控制提供可靠的,有保证的通信质量,是面向连接的通信。

因此,在通信之前,通信双方就得采用建立连接。

TCP通信采取C/S(客户机/服务器)模式。

需要分别编写客户端程序和服务器端程序。

1)服务器端程序编写步骤:a)加载套接字库,创建套接字(WSAStartup()/socket());b)绑定套接字到一个IP地址和一个端口上(bind());c)将套接字设置为监听模式等待连接请求(listen());d)请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept());e)用返回的套接字和客户端进行通信(send()/recv());f)返回,等待另一连接请求;g)关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。

2)客户端程序编写步骤:a)加载套接字库,创建套接字(WSAStartup()/socket());b)向服务器发出连接请求(connect());c)和服务器端进行通信(send()/recv());d)关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。

2、UDP网络聊天程序与TCP不同,UDP在通信时并不要双方建立连接,它不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频、视频和普通数据在传送时使用UDP较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。

比如我们聊天用的ICQ和OICQ就是使用的UDP协议。

因此,本设计同样采用UDP连接方式。

程序编写步骤:a)加载套接字库,创建套接字(WSAStartup()/socket());b)绑定套接字到一个IP地址和一个端口上(bind());c)发送和接收数据(sendto()/recvfrom());d)关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。

六、程序流程图TCP七.实验总结(错误与解决方法)1.必须先初始化Winsock DLL库,否则会显示错误代码:WSASYSNOTREADY 网络通信依赖的网络子系统还没有准备好。

WSAVERNOTSUPPORTED 所需的Windows Sockets API的版本未由特定的Windows Sockets实现提供。

2.窗口接收到数据包含“烫烫烫”,解决办法即用memset函数初始化数组:memset(sendBuf,0,sizeof(sendBuf));memset(recvBuf,0,sizeof(recvBuf));3.使用该程序时注意先打开服务器,再打开客户端,否则无法正确连接。

4.注意引入ws2_32.lib库文件。

实验二:一.题目:PING程序的设计与实现二.实验目的:PING程序是我们使用的比较多的用于测试网络连通性的程序。

PING程序基于ICMP,使用ICMP的回送请求和回送应答来工作。

由计算机网络课程知道,ICMP是基于IP的一个协议,ICMP包通过IP的封装之后传递。

三.实验原理:ping的原理: Ping命令的主要作用是检测网络上主机的状态。

要是在几年前,我们还可以下如此断言,如果不能Ping通某台主机,那么也就无法Telnet或者FTP到这台主机,但随着互联网的安全意识的增加,出现了访问控制清单的路由器和防火墙,由于ICMP报文是在IP数据包中被传输的,而到达一台主机不仅取决于IP层是否到达,还取决于使用何种协议和端口。

四. PING程序的实现过程要实现ping程序,需要实现以下步骤:1.创建协议类型为IPPROTO_ICMP的原始套接字,设置套接字属性。

2.创建并初始化ICMP封包。

3.调用sendto函数向远程主机发送ICMP请求。

4.调用recfrom函数接受ICMP响应五.核心模块的流程图:六.相关截图:1.PING本机:2.Ping局域网:七:实验总结(错误与解决方案)1.按照指导书上的代码输入并成功编译运行,在CDM命令提示窗口使用该EXE时,返回Request Timed Out"request time out"这提示除了对方可能装有防火墙或已关机以外,还有就是本机的IP不正确和网关设置错误。

①、IP不正确:IP不正确主要是IP地址设置错误或IP地址冲突,这可以利用ipconfig /all这命令来检查。

在WIN2000下IP冲突的情况很少发生,因为系统会自动检测在网络中是否有相同的IP 地址并提醒你是否设置正确。

在NT中不但会出现"request time out"这提示而且会出现"Hardware error"这提示信息比较特殊不要给它的提示所迷惑。

②、网关设置错误:这个错误可能会在第四个步骤出现。

网关设置错误主要是网关地址设置不正确或网关没有帮你转发数据,还有就是可能远程网关失效。

这里主要是在你Ping外部网络地址时出错。

错误表现为无法Ping外部主机返回信息"Request timeout"。

实验三:一.实验题目:基于IP多播的图形界面会议程序二.实验目的理解IP多播原理,并熟悉IP多播协议。

运用IP多播知识,设计一个图形界面的网络会议程序。

三.设计要求1、理解IP多播原理,熟悉IP多播协议。

2、了解IP多播的编程步骤。

3、用VisualC++实现局域网IP多播。

四.设计原理IP多播地址和多播组IP多播通信必须依赖于IP多播地址,在IPv4中它是一个D类IP地址,范围从224.0.0.0到239.255.255.255,并被划分为局部链接多播地址、预留多播地址和管理权限多播地址三类。

其中,局部链接多播地址范围在224.0.0.0~224.0.0.255,这是为路由协议和其它用途保留的地址,路由器并不转发属于此范围的IP包;预留多播地址为224.0.1.0~238.255.255.255,可用于全球范围(如Internet)或网络协议;管理权限多播地址为239.0.0.0~239.255.255.255,可供组织内部使用,类似于私有IP地址,不能用于Internet,可限制多播范围。

使用同一个IP多播地址接收多播数据包的所有主机构成了一个主机组,也称为多播组。

一个多播组的成员是随时变动的,一台主机可以随时加入或离开多播组,多播组成员的数目和所在的地理位置也不受限制,一台主机也可以属于几个多播组。

此外,不属于某一个多播组的主机也可以向该多播组发送数据包。

五.设计步骤接收功能实现步骤:(1)、创建一个SOCK_DGRAM类型的Socket。

(2)、将此Socket绑定到本地的一个端口上,为了接收服务器端发送的多播数据。

(3)、加入多播组。

(4)、接收多播数据。

发送功能实现步骤:(1)、创建一个SOCK_DGRAM类型的Socket。

(2)、加入多播组。

(3)、发送多播数据。

多线程相关代码:InitSocket();RECVPARAM *pRecvParam=new RECVPARAM;pRecvParam->sock=m_socket;pRecvParam->hwnd=m_hWnd;//创建接收线程HANDLE hThread=CreateThread(NULL,0,RecvProc,(LPVOID)pRecvParam,0,NULL);//关闭该接收句柄,释放其引用计数CloseHandle(hThread);程序截图:六.实验总结(错误以及解决方案)1.不能同时实现接收和发送功能:经查阅资料发现这是由于接收和发送功能的源代码中都有加入多播组程序段,一个程序不能多次加入同一个多播组。

后来共同加入多播组程序段,不再让接收和发送功能分别运行加入多播组程序段。

2.当编辑框内当前显示内容满了之后,垂直滚动条不能自动下跳,需要手动拉下去,调用编辑框类的LineScroll函数和GetLineCount();m_edit_recv.LineScroll(m_edit_recv.GetLineCount());。

相关主题