基于UDP协议的接收和.ppt_第1页
基于UDP协议的接收和.ppt_第2页
基于UDP协议的接收和.ppt_第3页
基于UDP协议的接收和.ppt_第4页
基于UDP协议的接收和.ppt_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第10章基于UDP协议的接收和发送,UDP协议是UserDatagramProtocol的简写,它是无连接的,不可靠的网络协议。本章介绍如何使用UDP协议进行程序设计,对UDP编程的基本框架进行介绍并给出程序设计的例子。本章中使用比较大的篇幅对UDP协议的程序设计中容易出现的问题进行的分析,并给出的解决的方法。主要包含如下内容:UDP的编程框架,主要介绍进行UDP协议程序设计的时候客户端和服务器端的两种不同的编程流程。介绍UDP协议程序设计常用的函数,对函数recv()/recvfrom()、send()/sendto()进行了介绍介绍一个使用UDP协议进行程序设计的实例。,10.1UDP编程框架,使用UDP进行程序设计可以分为客户端和服务器端两部分。服务器端主要包含建立套接字、将套接字与地址结构进行绑定、读写数据、关闭套接字几个过程。客户端包括建立套接字、读写数据、关闭套接字几个过程。服务器端和客户端二者流程之间的其主要的差别在于对于地址的绑定(bind)函数,客户端可以不用进行地址和端口的绑定操作。,10.1.1UDP编程框图,UDP协议的程序设计框架,客户端和服务器之间的差别在于服务器必须使用bind()函数来绑定侦听的本地UDP端口,而客户端则可以不进行绑定,直接发送到服务器地址的某个端口地址。与TCP程序设计相比较,UDP缺少了connect()、listen()及accept()函数,这是用于UDP协议无连接的特性,不用维护TCP的连接、断开等状态。1UDP协议的服务器端流程2UDP协议的客户端流程3UDP协议服务器和客户端之间的交互,10.1.1UDP编程框图,10.1.2UDP服务器编程框架,图10-1中对UDP协议中的服务器程序框架进行了说明。服务器流程主要分为下述的六个部分,即建立套接字、设置套接字地址参数、进行端口绑定、接收数据、发送数据、关闭套接字等。(1)建立套接字文件描述符,使用函数socket(),生成套接字文件描述符(2)设置服务器地址和侦听端口,初始化要绑定的网络地址结构。(3)绑定侦听端口,使用函数bind(),将套接字文件描述符和一个地址类型变量进行绑定。(4)接收客户端的数据,使用函数recvfrom()接收客户端的网络数据;(5)向客户端发送数据,使用函数sendto()向服务器主机发送数据;(6)关闭套接字,使用函数close()释放资源。,10.1.3UDP客户端编程框架,在图10-1中,同样对UDP协议的客户端流程进行了描述,按照图中所示,UDP协议的客户端流程分为套接字建立、设置目的地址和端口、向服务器发送数据、从服务器接收数据、关闭套接字等五个部分。与服务器端的框架相比,少了bind()部分,客户端程序的端口和本地的地址可以由系统进行使用时指定,在sendto()和recvfrom()的时候,网络协议栈会临时指定本地的端口和地址:建立套接字文件描述符,socket();设置服务器地址和端口,structsockaddr;向服务器发送数据,sendto();接收服务器的数据,recvfrom();关闭套接字,close()。,10.2UDP协议程序设计常用函数,UDP协议常用的函数有recv()/recvfrom()、send()/sendto()、socket()、bind()等等。当然这些函数同样可以用于TCP协议的程序设计。,10.2.1建立套接字socket()和绑定套接字bind(),UDP协议建立套接字的方式如TCP的方式一样,使用socket()函数,只不过,协议的类型使用SOCK_DGRAM,而不是参数SOCK_STREAM。例如下面是建立一个UDP套接字文件描述符的代码:ints;s=socket(AF_INET,SOCK_DGRAM,0);,10.2.2接收数据recvfrom()/recv(),当客户端成功建立了一个套接字文件描述符并构建了合适的structsockaddr结构后,或者服务器端成功的将套接字文件描述符和地址结构绑定后,可以使用recv()或者recvfrom()来接收到达此套接字文件描述符上的数据或者在这个套接字文件描述符上等待数据的到来。1函数recv()和recvfrom()介绍2使用函数recvfrom()的例子3应用层recv()函数和内核函数的关系,10.2.3发送数据sendto()/send(),当客户端的成功的建立了一个套接字文件描述符并构建了合适的structsockaddr结构后,或者服务器端成功的将套接字文件描述符和地址结构绑定后,可以使用send()或者sendto()函数来发送数据到某个主机上。1函数send()和sendto()介绍2使用函数sendto()的例子3应用层函数sendto()和内核函数的关系,10.2.3发送数据sendto()/send(),10.3UDP接收和发送数据的例子,本节介绍一个简单的UDP服务器和客户端的例子,说明如何使用UDP函数进行程序设计。,10.3.1UDP服务器端,UDP的服务器端与TCP服务器端十分相似,不过流程要简单的多。服务器的代码如下,其步骤为:(1)建立一个套接字文件描述符s。(2)填充地址结构addr_serv,协议为AF_INET,地址为任意地址,端口为PORT_SERV(8888)。(3)将套接字文件描述符s绑定到地址addr_serv。(4)调用udpserv_echo()函数处理客户端数据。,10.3.2UDP服务器端数据处理,函数udpserv_echo()的代码如下,其中的处理过程很简单,服务器循环等待客户端的数据,当服务器接收到客户端的数据后,将接收到的数据发回给客户端。#defineBUFF_LEN256staticudpserv_echo(ints,structsockaddr*client)intn;charbuffBUFF_LEN;intlen;while(1)len=sizeof(*client);n=recvfrom(s,buff,BUFF_LEN,0,client,10.3.3UDP客户端,UDP客户端向服务器端发送数据“UDPTEST”,然后接收服务器端的恢复信息,并将服务器端的数据打印出来。客户端的代码如下,其步骤为:(1)建立一个套接字文件描述符s。(2)填充地址结构addr_serv,协议为AF_INET,地址为任意地址,端口为PORT_SERV(8888)。(3)将套接字文件描述符s绑定到地址addr_serv。(4)调用udpclie_echo()函数和服务器通信。,10.3.4UDP客户端数据处理,函数udpclie_echo()的代码如下,其中处理过程同样简单,向服务器端发送字符串“UDPTEST”,接收服务器的响应,并将接收到的服务器数据打印出来。#defineBUFF_LEN256staticvoidudpclie_echo(ints,structsockaddr*to)charbuffBUFF_LEN=UDPTEST;structsockaddr_infrom;intlen=sizeof(*to);sendto(s,buff,BUFF_LEN,0,to,len);recvfrom(s,buff,BUFF_LEN,0,(structsockaddr*),10.3.5测试UDP程序,将服务器端的代码存到udp_server01.c文件中,将客户端的代码存放到udp_client01.c文件中。按照如下方式进行编译:Debian#gccoserver01udp_server01.cDebain#gccoclient01udp_client01.c先运行服务器程序,这时UDP服务器会在8888端口等待数据到来。Debain#./server01再运行客户端的程序,客户端向服务器端发送字符串“UDPTEST”,并接收服务器的信息反馈。Debain#./client01则客户端的输出为:recved:UDPTEST,10.4UDP协议程序设计中的几个问题,相对于TCP协议的程序设计,UDP协议的程序虽然程序设计的环节要少一些,但是由于UDP协议缺少流量控制等机制,容易出现一些难以解决的问题。UDP的报文丢失、报文乱序、connet函数、流量控制、外出网络接口的选择等是比较容易出现的问题,本节对此进行介绍并给出初步的解决建议方法。,10.4.1UDP报文丢失数据,利用UDP协议进行数据收发的时候,在局域网内一般情况下数据的接收方均能接收到发送方的数据,除非连接双方的主机发生故障,否则不会发生接收不到数据的情况。1UDP报文的正常发送过程2UDP报文的丢失3UDP报文丢失的对策,10.4.1UDP报文丢失数据,10.4.1UDP报文丢失数据,10.4.1UDP报文丢失数据,10.4.2UDP数据发送中的乱序,UDP协议数据收发过程中,会出现数据的乱序现象。所谓乱序是发送数据的顺序和接收数据的顺序不一致,例如发送数据的顺序为数据包A、数据包B、数据包C,而接收数据包的顺序变成了数据包B、数据包A、数据包C。1UDP数据顺序收发的过程2UDP数据的乱序3UDP乱序的对策,10.4.2UDP数据发送中的乱序,10.4.3UDP协议中的connect()函数,函数connect()在TCP协议中会发生三次握手,建立一个持续的连接,一般不用于UDP。在UDP协议中使用函数connect()的作用仅仅表示确定了另一方的地址,并没有其他的含义。函数connect()在UDP协议中使用后会产生如下的副作用:使用connect()函数绑定套接字后,发送操作不能再使用sendto()函数,要使用write()函数直接操作套接字文件描述符,不在指定目的地址和端口号。使用connect()函数并定套接字后,接收操作不能再使用recvfrom()函数,要使用read()类的函数,函数不会返回发送方的地址和端口号。在使用多次connect()函数的时候,会改变原来套接字绑定的目的地址和端口号,用新绑定的地址和端口号代替,原有的绑定状态会失效。可以使用这种特定来断开原来的连接。,10.4.4UDP缺乏流量控制,UDP协议没有TCP协议所具有的滑动窗口概念,接收数据的时候直接将数据放到缓冲区中。如果用户没有及时的从缓冲区中将数据复制出来,后面到来的数据会接着向缓冲区中放入。当缓冲区满的时候,后面到来的数据会覆盖之前的数据造成数据的丢失。1UDP缺乏流量控制概念2缓冲区溢出对策,10.4.5UDP协议中的外出网络接口,在网络程序设计的时候,有时需要设置一些特定的条件。例如一个主机有两个网卡,由于不同的网卡连接不同的子网,用户发送的数据想从其中的一个网卡发出,将数据发送到特定的子网上。使用函数connect()可以将套接字文件描述符与一个网络地址结构进行绑定,在地址结构中所设置的值是发送接收数据的时候套接字采用的IP地址和端口。,10.4.6UDP协议中的数据报文截断,当使用UDP协议接收数据的时候,如果应用程序传入的接收缓冲区的大小小于到来数据的大小的时候,接收缓冲区会保存最大可能接收到的数据,其他的数据,将会丢失,并且有MSG_TRUNC的标志。,10.5小结,本章介绍了如何使用UDP协议进行套接字编程,也介绍了

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论