计算机网络实验报告.docx
- 文档编号:29833101
- 上传时间:2023-07-27
- 格式:DOCX
- 页数:16
- 大小:280.59KB
计算机网络实验报告.docx
《计算机网络实验报告.docx》由会员分享,可在线阅读,更多相关《计算机网络实验报告.docx(16页珍藏版)》请在冰豆网上搜索。
计算机网络实验报告
计算机网络
课程设计报告
姓名:
学号:
班级:
指导老师:
湖南科技大学计算机科学与工程学院
2014年2月
目录
第一部分:
网络聊天
1.实验目的··························································3
2.实验内容··························································3
3.实验方法··························································3
4.实验步骤··························································4
5.运行结果··························································4
6.心得体会·························································5
第二部分:
Ping程序
1.实验目的·························································6
2.实验环境·························································6
3.实验步骤·························································7
4.运行结果·························································8
5.心得体会·························································9
第三部分:
多播会议
1.实验目的························································10
2.实验环境························································12
3.实验步骤························································13
4.心得体会························································16
实验一:
网络聊天程序的设计与实现
一、实验目的
1、熟悉VisualC++的基本操作;掌握最基本的Client/Server(客户机/服务器)模式的网络编程技术,并在此基础上实现更为复杂的网络编程。
2、基本了解基于对话框的windows应用程序的编写过程。
3、对于WindowsSocket编程建立初步概念。
二、实验内容
1、按实验步骤中参考程序使用VC++设计出程序;
2、在第1步的基础上使用VC++或其他工具设计出一个能实现两个人聊天的网络程序。
三、实验方法
程序分为服务端和客户端两个
服务器端:
服务器程序首选启动,通过调用socket()函数建立一个套接字,然后调用bind()函数使套接字和本地网络地址联系在一起,再调用listen()使套接字做好侦听的准备,并规定它的请示队列的长度,之后就调用accept()来接收连接。
客户机端:
客户机程序也使用socket()建立套接字,然后调用connect()函数和服务器建立连接。
连接一旦建立,客户机和服务器之间就可以通过调用read()和write()来发送和接收数据。
最后,等数据传送结束后,双方调用close()关闭套接字。
四、实验环境和实验工具
实验环境:
Windows平台、实验工具:
VC++
五、实验步骤
sockets(套接字)编程有三种,流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM),原始套接字(SOCK_RAW);基于TCP的socket编程是采用的流式套接字。
在这个程序中,将两个工程添加到一个工作区。
要链接一个ws2_32.lib的库文件。
服务器端编程的步骤:
1:
加载套接字库,创建套接字(WSAStartup()/socket());
2:
绑定套接字到一个IP地址和一个端口上(bind());
3:
将套接字设置为监听模式等待连接请求(listen());
4:
请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept());
5:
用返回的套接字和客户端进行通信(send()/recv());
6:
返回,等待另一连接请求;
7:
关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。
计算机网络中的系统调用顺序:
六、运行结果
(服务器端)
(客户端)
七、心得体会
通过实验加深对VC++6.0的了解和掌握,对该程序有了更深刻的认识!
问题1:
连接时所有有关winsock的库函数连接不上?
分析:
缺少了某个头文件或没打开动态库,解决办法是在开头加上一下代码:
#pragmacomment(lib,"ws2_32.lib");
问题2:
在调试工程中,没有链接ws2_32.lib的库文件,出笑了错误。
如图:
分析:
实验二、Ping程序设计与实现
一、实验目的:
通过设计Ping程序,理解Ping程序的实现原理,并初步讲解了c语言网络编程技术。
本章涉及很多网络编程函数和编程技巧,包括库文件的导入;winsock的初始化、注销;socket的创建、关闭;设置socket选项;根据主机名获取IP地址;从堆中分配一定数量的空间、释放从堆中分配的空间;数据报的发送;数据报的接等。
二、实验环境:
WindowsXP+VisualC++6.0
三、实验任务:
实现ping的基本功能,实现ping–t
四、程序流程
Ping程序的设计与实现大致可分为四个模块(见图1-1),分别是:
初始化模块、功能控制模块、ping模块、mian测试模块。
(图1-1)
五、实验步骤:
1.Ping程序设计思路:
要实现ping程序,需要实现以下步骤:
(1)创建协议类型为IPPROTO_ICMP的原始套接字,设置套接字属性。
(2)创建并初始化ICMP封包。
(3)调用sendto函数向远程主机发送ICMP请求。
(4)调用recfrom函数接受ICMP响应。
2.程序功能模块。
主功能模块
Ping()函数是本程序的核心部分,它基本是调用其他模块的函数来实现最终功能,其主要布骤包括:
定义及初始化各个全局变量、打开socket动态库、设置接收和发送超时值、域名地址解析、分配内存、创建及初始化ICMP报文、发送ICMP请求报文、接收ICMP应答报文以及解读应答报文和输出Ping结果,最后释放占用的资源其流程如下页图2.1所示。
(1)该模块并非只有处理还包括判断及输出判断结果的含义;
(2)程序没运行一次就只能输出四行结果(前提是输入的地址有效),欲再次PING其他地址必须要重新启动程序。
(3)输入时不能输入目标主机名,不然ping结果为TIMEOUT;
主功能模块图如2-1所示
(图2-1)
3、VC中socket编程步骤:
sockets(套接字)编程有三种,流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM),原始套接字(SOCK_RAW);基于TCP的socket编程是采用的流式套接字。
在这个程序中,将两个工程添加到一个工作区。
要链接一个ws2_32.lib的库文件。
服务器端编程的步骤:
1:
加载套接字库,创建套接字(WSAStartup()/socket());
2:
绑定套接字到一个IP地址和一个端口上(bind());
3:
将套接字设置为监听模式等待连接请求(listen());
4:
请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept());
5:
用返回的套接字和客户端进行通信(send()/recv());
6:
返回,等待另一连接请求;
7:
关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。
六、运行结果
七、心得体会
问题1:
提示库函数名为未标示符?
分析:
在程序开头只有以下头文件,
#include
#include
#include
忘记打开
问题2:
.h文件和.cpp文件全部放到C++SourceFile。
分析:
.h是头文件,是一些类的声明,方法的声明的地方,.cpp是源文件。
C++里面编译的单位是compileunit,也就是经过预处理之后的源文件,这包括宏的处理,以及include文件的替换等。
一般来说,h文件用于函数和变量的声明,而cpp文件则用于定义。
对于C++编译环境而言,他们都不过是操作系统内的文件,h文件可以includecpp文件,cpp文件也可以includeh文件。
他们的区别是人们在编译/链接过程中为了方便的强加进去的。
问题3:
没有进行程序变量的设置出现错误,如图:
分析:
实验三、基于IP多播传输的网络会议程序
多播
多播是有多播地址的,这个地址是默认的不用分组,广播也是多播的一种,我们常说的广播风暴就是其中之一。
路由器和电脑都可以发送多播。
多播组
使用同一个IP多播地址接收数据包的所有主机构成一个主机组,即多播组。
一个主机可以随时加入或离开多播组,一个主机也可以属于多个多播组。
不属于某个多播组的主机也可以向该多播组发送数据包。
一、实验目的
1.理解IP多播的基本原理。
2.掌握网际组管理协议IGMP。
3.掌握基于WinSock2的多播应用程序设计方法。
二、实验内容
编制多播程序,实现互联网环境下消息的多播传递。
三、实验环境
实验环境:
Windows平台、实验工具:
VC++
四、实现方法
1、协议支持
并不是所有的协议都支持多播通信,对Win32平台而言,仅两种可从WinSock内访问的协议(IP/ATM)才提供了对多播通信的支持。
因通常通信应用都建立在TCP/IP协议之上的,所以本文只针对IP协议来探讨多播通信技术。
2、多播地址
IP采用D类地址来支持多播。
每个D类地址代表一组主机。
共有28位可用来标识小组。
所以可以同时有多达25亿个小组。
当一个进程向一个D类地址发送分组时,会尽最大的努力将它送给小组的所有成员,但不能保证全部送到。
3、多播路由器
多播由特殊的多播路由器来实现,多播路由器同时也可以是普通路由器。
各个多播路由器每分钟发送一个硬件多播信息给子网上的主机(目的地址为224.0.0.1),要求它们报告其进程当前所属的是哪一组,各主机将它感兴趣的D类地址返回。
4、库支持
WinSock提供了实现多播通信的API函数调用。
针对IP多播,WinSock提供了两种不同的实现方法,具体取决于使用的是哪个版本的WinSock。
第一种方法是WinSock1提供的,要求通过套接字选项来加入一个组;另一种方法是WinSock2提供的,它是引入一个新函数,专门负责多播组的加入,这个函数便是WSAJoinLeaf,它是基层协议无关的。
本文将通过一个多播通信的实例的实现过程,来讲叙多播实现的主要步骤。
因为Window98以后版本都安装了Winsock2.0以上版本,所以本文实例在WinSock2.0平台上开发的,但在其中对WinSock1实现不同的地方加以说明。
五、编程步骤
1、启动VisualC++6.0,创建一个控制台项目工程MultiCase。
在此项目工程中添加Sender和Receiver两个项目。
Receiver项目实现步骤:
(1)、创建一个SOCK_DGRAM类型的Socket。
(2)、将此Socket绑定到本地的一个端口上,为了接收服务器端发送的多播数据。
(3)、加入多播组。
①、WinSock2中引入一个WSAJoinLeaf,此函数原型如下:
SOCKETWSAJoinLeaf(SOCKETs,conststructsockaddrFAR*name,intnamelen,
LPWSABUFlpCallerData,LPWSABUFlpCalleeData,LPQOSlpSQOS,LPQOSlpGQOS,DWORDdwFlags);
其中,第一个参数s代表一个套接字句柄,是自WSASocket返回的。
传递进来的这个套接字必须使用恰当的多播标志进行创建;否则的话WSAJoinLeaf就会失败,并返回错误WSAEINVAL。
第二个参数是SOCKADDR(套接字地址)结构,具体内容由当前采用的协议决定,对于IP协议来说,这个地址指定的是主机打算加入的那个多播组。
第三个参数namelen(名字长度)是用于指定name参数的长度,以字节为单位。
第四个参数lpCallerData(呼叫者数据)的作用是在会话建立之后,将一个数据缓冲区传输给自己通信的对方。
第五个参数lpCalleeData(被叫者数据)用于初始化一个缓冲区,在会话建好之后,接收来自对方的数据。
注意在当前的Windows平台上,lpCallerData和lpCalleeData这两个参数并未真正实现,所以均应设为NULL。
LpSQOS和lpGQOS这两个参数是有关Qos(服务质量)的设置,通常也设为NULL,有关Qos内容请参阅MSDN或有关书籍。
最后一个参数dwFlags指出该主机是发送数据、接收数据或收发兼并。
该参数可选值分别是:
JL_SENDER_ONLY、JL_RECEIVER_ONLY或者JL_BOTH。
②、在WinSock1平台上加入多播组需要调用setsockopt函数,同时设置IP_ADD_MEMBERSHIP选项,指定想加入的那个组的地址结构。
具体实现代码将在下面代码注释列出。
(4)、接收多播数据。
Sender实现步骤:
(1)、创建一个SOCK_DGRAM类型的Socket。
(2)、加入多播组。
(3)、发送多播数据。
3、编译两个项目,在局域网中按如下步骤测试:
(1)、将Sender.exe拷贝到发送多播数据的PC上。
(2)、将Receiver.exe拷贝到多个要求接收多播数据的PC上。
(3)、各自运行相应的程序。
(4)、在SenderPC上输入多播数据后,你就可以在ReceiverPC上看到输入的。
具体实现步骤:
1.初始化WinSock资源
//初始化WinSock2资源,检查系统是否安装了WinSock2以上版本
wVersionRequested=MAKEWORD(2,2);
err=WSAStartup(wVersionRequested,&wsaData);
2.创建套接字
Sock=WSASocket(AF_INET,SOCK_DGRAM,IPPROTO_UDP,
(LPWSAPROTOCOL_INFO)NULL,0,
WSA_FLAG_OVERLAPPED|
WSA_FLAG_MULTIPOINT_C_LEAF|
WSA_FLAG_MULTIPOINT_D_LEAF
);
bFlag=TRUE;
err=setsockopt(Sock,SOL_SOCKET,SO_REUSEADDR,
(char*)&bFlag,sizeof(bFlag));
local.sin_family=PF_INET;
local.sin_port=htons((USHORT)m_nPort);
local.sin_addr.s_addr=htonl(INADDR_ANY);
err=bind(Sock,(structsockaddrFAR*)&local,sizeof(local));
3.设置多播数据报生存时间TTL
//设置多播数据报传播范围(生存时间TTL)
err=WSAIoctl(Sock,SIO_MULTICAST_SCOPE,&m_nTTL,
sizeof(m_nTTL),NULL,0,&cbRet,NULL,NULL);
4.设置多播返回
//设置多播返回(LOOKBACK)
err=WSAIoctl(Sock,SIO_MULTIPOINT_LOOPBACK,&nLoopBack,
sizeof(nLoopBack),NULL,0,&cbRet,NULL,NULL);
5.加入/离开一个多播组
Remote.sin_family=PF_INET;
Remote.sin_addr.s_addr=inet_addr((char*)m_IPAddress);
Remote.sin_port=htons((USHORT)m_nRemotePort);
SockM=WSAJoinLeaf(Sock,(sockaddr*)&Remote,sizeof(Remote),
NULL,NULL,NULL,NULL,JL_BOTH);//加入多播组
closesocket(SockM);//离开多播组
6.向多播组发送数据
sendto(Sock,strMessage,nSize,0,(sockaddr*)&Remote,sizeof(Remote));
7.从多播组接收数据
recvfrom(Sock,ReceiveBuf,32000,0,(sockaddr*)&From,&Fromlen);
8.关闭套接字,释放WinSock资源
closesocket(SockM);//关闭多播套接字,退出多播组
closesocket(Sock);//关闭UDP套接字,结束数据的收发
WSACleanup();//释放WinSock资源
六、运行结果
七、心得体会
问题1:
本实验你用到了哪些套接字选项?
它们属于什么级别?
分析:
使用了SO_REUSEADDR允许同一port上启动同一服务器的多个实例,但每个实例绑定的IP地址是不能相同的。
IP_ADD_MEMBERSHIP加入多播组。
问题2:
多播和广播相比有什么优势?
分析:
在广播通信中,网络层提供了将封包从一个节点发送到所有其他节点的服务;多播可以使一个源节点发送封包的复制到其他多个网络节点的集合。
利用广播可以将数据发送给本地子网上的每个机器。
广播的缺点是如果多个进程都发送广播数据,网络就会阻塞,网络性能便会受到影响。
虽然理论上可以像播放电视节目一样在整的Internet上发送广播数据,但是几乎没有路由器转发广播数据,所以广播数据只能应用在本地子网中。
使用多播服务,封包仅被发送到网络节点的一个集合中,“多播”可以理解为一个人向多个人说话,这样能够提高通话的效率,如果你要通知特定的一群人同一件事情,但是又不想让其他人知道,使用电话一个一个地通知就非常麻烦,而使用日常生活的大喇叭进行广播通知,就达不到只通知个别人的目的了,此时使用“多播”来实现就会非常方便快捷。
通过本次实验,掌握了IP多播的基本概念和工作原理,同时也掌握了广播通信的基本概念和工作原理,比较并理解了二者的异同和各自的优缺点。
在实验过程中,重点学习和掌握了使用setsockopt()和getsockopt()操作套接字选项,尤其是使用其进行加入多播地址操作和退出多播组操作。
对这两个函数的各个参数及调用方法有了更进一步的理解。
本次实验的完成,是对课本知识的重温和巩固,在试验过程中,程序编写完成后没有立即实现功能,而是通过不断地调试、修改,才使程序得以正确运行,所以在完成实验内容的过程中也锻炼了自己调试代码和解决问题的能力。
通过完成实验,对网络编程更加熟悉,并重新认识了其重要性,对课堂上学习的知识进行了温习和巩固,个人编程和调试能力也得到了提高
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机网络 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)