基于UDP传输协议的应用程序开发实验邓荣飞工程硕士.docx
- 文档编号:17997722
- 上传时间:2023-08-05
- 格式:DOCX
- 页数:15
- 大小:163.08KB
基于UDP传输协议的应用程序开发实验邓荣飞工程硕士.docx
《基于UDP传输协议的应用程序开发实验邓荣飞工程硕士.docx》由会员分享,可在线阅读,更多相关《基于UDP传输协议的应用程序开发实验邓荣飞工程硕士.docx(15页珍藏版)》请在冰点文库上搜索。
基于UDP传输协议的应用程序开发实验邓荣飞工程硕士
深圳大学实验报告
课程名称:
网络工程
实验项目名称:
UDP传输协议的应用程序开发实验
学院:
计算机与软件学院
专业:
计算机科学与技术
指导教师:
报告人:
邓荣飞班级:
工程硕士2011
实验时间:
2011年12月07日
实验报告提交时间:
2011年1月8日
教务处制
基于UDP的应用程序开发实验
1、TCP/IP协议族
链路层
TCP/IP协议族的最低层,也称为网络接口层,通常包含操作系统中的设备驱动程序和对应的网络接口卡,对应于OSI参考模型中的数据链路层和物理层。
负责接收网络层的IP数据报并通过网络发送到网络传输介质上,或者从网络上接收物理帧,抽出IP数据报,交给网络层。
TCP/IP协议族并没有具体定义链路层,只要是在其上能进行IP数据报传递的物理网络都可以作为TCP/IP中的链路层,如以太网、令牌网等。
这样使得TCP/IP在数据链路层的选择上有较大的灵活性。
网络层
也称为互联网层,由于该层的主要协议为IP,通常也简称为IP层。
该层主要负责相邻计算机之间的通信,把某主机(信源)上的数据包发送到因特网中的任何一台目标主机(信宿)上,即点到点通信。
其包括三方面功能。
☐处理来自传输层的数据报发送请求
☐处理输入数据报
☐处理路径、流控、拥塞等问题。
网络层协议包括IP(网际协议)、ICMP(因特网控制报文协议)和IGMP(因特网组管理协议)。
传输层
通常所说的两台计算机之间的通信其实是指两台计算机上对应的应用程序之间的数据通信,传输层提供的就是应用程序间的通信,一般也称为端到端的通信。
其功能包括:
☐格式化信息流;
☐提供可靠传输。
应用层
应用层向用户提供一组常用的应用程序,主要包括超文本传输协议(HTTP),简单网络管理协议(SNMP),文件传输协议(FTP),简单邮件传输协议(SMTP),域名系统(DNS),远程登录协议(Telnet)等。
尽管应用层为用户提供的协议较多,但是其只能满足用户的一般需求。
2、TCP/IP的工作过程
网络应用程序一般是以客户机/服务器模型(Client/Server,C/S)工作。
客户机和服务器是指一次通信中的两个应用程序。
1.主动发起联系的一方称为客户机程序,它为用户提供向网络请求服务的接口;
2.而被动等待联系的一方称为服务器程序,它负责接受用户的服务请求,提供资源共享,而且可以同时满足多个客户机的需求。
3.客户机是服务请求方,服务器是服务提供方。
客户机/服务器模型的工作模型
3、UDP传输原理和套接字介绍
UDP为用户数据协议的简称(UserDatagramProtocol,UDP)是传输层的两个主要协议之一,相对TCP来说,UDP是一种非常简单的协议,在网络层的基础上实现了应用进程之间端到端的通信。
UDP提供的是一种无连接的、不可靠的数据传输方式,在数据传输过程中没有流量控制和确认机制,数据报可能会丢失、延迟、乱序到达信宿。
UDP只是提供了利用校验和检查数据完整性的简单差错控制,属于一种尽力而为的数据传输方式。
UDP主要特征:
1.UDP是一个无连接协议,传输数据之前信源和信宿不建立连接,因此不存在连接建立的时延。
在信源端,UDP传送数据的速度仅仅受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在信宿端,UDP把每个数据报放在队列中,应用程序每次从队列中读一个数据报。
2.不需要维护连接状态,包括收发状态等,这样一台服务机可同时向多个客户机传输相同的数据,如实现多播。
3.UDP数据报的首部很短,只有8字节,相对于TCP的20字节首部的开销要小很多。
4.吞吐量不受流量控制算法的调节,只受应用软件生成数据的速率、传输带宽、信源和信宿主机性能的限制。
UDP数据报格式和封装:
1.
UDP数据报的格式
*源端口号,即运行在信源机的应用进程所使用的端口号。
*目的端口号,即运行在信宿机的应用进程所使用的端口号。
*数据报总长度,定义了用户数据报的总长度,即UDP数据报的首部和数据的长度和。
*校验和,用于检验整个用户数据报的差错。
2.UDP数据报的封装
套接字概念:
1.在网络中要全局地标识一个参与通信的进程,需要采用三元组:
协议、主机IP地址、端口号。
2.要描述两个应用进程之间的端到端的通信关联则需要一个五元组:
协议、信源机IP地址、信源应用进程端口、信宿机IP地址、信宿应用进程端口。
3.套接字可以理解为通信连接的一端,其主要包括协议、主机IP地址和端口号。
4.将两个套接字连接到一起便可以在不同应用进程之间传递数据
5.套接字实现了对网络和传输层协议的封装,为应用进程之间的通信连接的建立、数据传输等通信过程提供了编程界面。
4、实验的内容和基本要求
在Windows系统环境下,利用微软提供的WinSockAPI函数来开发一套工具,实现UDP多台机器之间的数据传输。
基本要求:
1.实现两台或者多台机器上的数据传输
2.软件实现数据的简单校验
3.有良好的操作界面
5、分析和实验
根据UDP传输原理,是一个无连接的,不可靠的数据传输方式。
因此在网络编程当中不需要在客户机和服务器之间事先建立连接,通信的任何一方可以先发送数据,这样先发送的一方便成了客户机,而接受数据的一方便是服务器方。
在数据传输完成后,只要关闭套接字,释放网络资源,通信过程就结束。
无连接的数据报传输过程中,由于不需要事先连接,因此在发送数据时,发送方除了需要指定本地套接字的地址外,还需要指定接收方的套接字地址,即在数据收发过程中动态建立通信双方的通信连接。
下面为无连接的客户机/服务器程序工作模型,也为UDP应用编程的模型:
由于UDP协议传输不对传输的数据进行校验,为了保证数据传输的正确性,我们必须在接收方用软件的方式去实现校验。
在发送数据端对发送数据计算长度并嵌入到发送数据缓存的最后一位,跟随数据一起发送出去,接受数据端对数据进行的长度重新计算并和接受数据的最后一位相比较,通过这样的方式进行简单的数据校验。
6、实验步骤设计
1.实现两台或者多台机器上的数据传输:
利用winsoct开发工具设计客户端和服务器端,采用UDP套接字方式来实现网络中的数据传输。
利用现有的函数类调用实现数据的发送和接受;
2.软件实现数据的校验:
采用发送数据端对发送数据计算长度并嵌入到发送数据缓存的最后一位,跟随数据一起发送出去,接受数据端对数据进行的长度重新计算并和接受数据的最后一位相比较,通过这样的方式进行简单的数据校验;
7、测试和结论
主机:
strlen(recv_buf)7表示:
当前接收到的字符串长度为7(发送的字符串加一位校验码);
recv_buf[strlen(recv_buf)-1]6表示:
所接收的到的实际有效数据长度为6;
客户端:
strlen(send_buf)6表示:
当前发送的有效数据的字符串长度为6;
strlen(send_buf)7表示:
加校验位之后的发送缓存长度为7,有效数据6位,校验位为1位;
send_buf[strlen(send_buf)-1]6表示:
校验位的数值为6,即有效数据的字符串长度;
从上面的途中那个可以看到,recv_buf[strlen(recv_buf)-1]=strlen(recv_buf)-1=strlen(send_buf)说明发送的数据正确的发送和接收到了,程序实现了对接收的数据进行简单的校验工作。
下面是测试结果:
8、实验总结
通过本次的实验,使我了解了UDP协议的基本知识和数据传输中其所具有的特性。
学习了如何去获取在程序设计当中遇到了很多问题,每次都在网上不停的寻找答案,但很多原理就在书上。
学习应该明白其原理,不能只为实现其功能而去写程序。
程序设计中简单数据校验和奇偶校验是应用比较广泛的一种传输数据校验方式,在这次实验中学习了其基本的原理,校验码的生成,和接收端数据的验证方法。
在老师的细心教导下,通过课程的学习和实验,了解了TCP/IP协议,路由协议,多播协议等的基本原理和编程方法,感谢老师的教导和帮助。
9、程序清单
//UDP.cpp:
Definestheentrypointfortheconsoleapplication.
//
#include"stdafx.h"
#include
#include
usingnamespacestd;
#include
#pragmacomment(lib,"ws2_32.lib")
intmain(intargc,char*argv[])
{
constintDEFAULT_PORT=5050;
constintDATA_BUFFER_LENGHT=1024;
SOCKETlocatesocket;
SOCKADDR_INlocateAddr,remoteAddr;//本地和远程主机地址
intlocatePort,remotePort;//本地和远程套接字端口号
interr;
intiLen,iSend,iRecv;//远程端地址长度,发送数据长度,接收数据长度
//charapply_Message[]="messagefromClient!
\n";//请求连接信息
//发送数据缓冲区,接收数据缓冲区
charsend_buf[DATA_BUFFER_LENGHT]="\0",recv_buf[DATA_BUFFER_LENGHT]="\0";
boolclientFlag=false;//客户端标志,即请求方
WORDwVersionRequested;
WSADATAwsaData;
//根据参数设置相应的套接字参数
if(argc<4){
cout<<"Thisisaserverprogram:
udph端口号"< cout<<"Serverwaiting"< if(argc<2) locatePort=DEFAULT_PORT; else locatePort=atoi(argv[1]); } else { locatePort=atoi(argv[1]); remotePort=atoi(argv[3]); remoteAddr.sin_family=AF_INET; remoteAddr.sin_port=htons(remotePort); remoteAddr.sin_addr.S_un.S_addr=inet_addr(argv[2]); clientFlag=true; cout<<"Thisisanclientprogram: udpc端口号ServerIP端口号"< } //加载Winsocket动态库 wVersionRequested=MAKEWORD(2,2); err=WSAStartup(wVersionRequested,&wsaData); if(err! =0){ cout<<"FailedtoloadWinsock.\n"; return0; } //创建本地套接字 locatesocket=socket(AF_INET,SOCK_DGRAM,0); if(locatesocket==INVALID_SOCKET) { cout<<"socket()Failed: "< return0; } //设置本地套接字相关参数 locateAddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY); locateAddr.sin_family=AF_INET; locateAddr.sin_port=htons(locatePort); err=bind(locatesocket,(SOCKADDR*)&locateAddr,sizeof(SOCKADDR)); if(err! =0) { cout<<"bind()Failed: "< return0; } iLen=sizeof(remoteAddr); //客户进程首先发送数据 if(clientFlag){ cin>>send_buf; /*发送数据和校验字节*/ cout<<"strlen(send_buf)"< send_buf[strlen(send_buf)]=(char)strlen(send_buf); cout<<"strlen(send_buf)"< cout<<"send_buf[strlen(send_buf)-1]"<<(int)send_buf[strlen(send_buf)-1]< iSend=sendto(locatesocket,send_buf,strlen(send_buf)+1,0,(SOCKADDR*)&remoteAddr,sizeof(remoteAddr)); if(iSend==SOCKET_ERROR) { cout<<"sendto()Failed: "< }elseif(iSend>0){ send_buf[strlen(send_buf)-1]=''; cout<<"Message: "< "< } } //循环处理双方数据传输 while (1) { iRecv=recvfrom(locatesocket,recv_buf,DATA_BUFFER_LENGHT,0,(SOCKADDR*)&remoteAddr,&iLen); if(iRecv==SOCKET_ERROR) { cout<<"recvfrom()Failed: "< break; } elseif(iRecv>0) { /*进行数据校验*/ err=(recv_buf[strlen(recv_buf)-1]==(strlen(recv_buf)-1)); cout<<"strlen(recv_buf)"< cout<<"recv_buf[strlen(recv_buf)-1]"<<(int)recv_buf[strlen(recv_buf)-1]< if(err==0)//如果校验错误 { cout<<"Receive: "< cout<<"Receiveinfoerror."< continue;//返回1表示校验错误 } else { //recv_buf[strlen(recv_buf)]='/0'; recv_buf[strlen(recv_buf)-1]=''; cout<<"Receive: "< "< "< } } cin>>send_buf; /*发送数据和校验字节*/ cout<<"strlen(send_buf)"< send_buf[strlen(send_buf)]=(char)strlen(send_buf); cout<<"strlen(send_buf)"< cout<<"send_buf[strlen(send_buf)-1]"<<(int)send_buf[strlen(send_buf)-1]< iSend=sendto(locatesocket,send_buf,strlen(send_buf)+1,0,(SOCKADDR*)&remoteAddr,sizeof(remoteAddr)); if(iSend==SOCKET_ERROR) { cout<<"sendto()Failed: "< break; }elseif(iSend>0){ send_buf[strlen(send_buf)-1]=''; cout<<"Message: "< "< } //关闭套接字和清理系统资源 closesocket(locatesocket); WSACleanup(); } return0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 UDP 传输 协议 应用程序 开发 实验 邓荣飞 工程硕士