【精品】udp插口编程

【精品】udp插口编程

ID:26569703

大小:170.50 KB

页数:23页

时间:2018-11-27

【精品】udp插口编程_第1页
【精品】udp插口编程_第2页
【精品】udp插口编程_第3页
【精品】udp插口编程_第4页
【精品】udp插口编程_第5页
资源描述:

《【精品】udp插口编程》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、海量管理资源免费下载!第4章UDP插口编程在上一章中我们已经介绍了TCP插口编程,本章我们介绍另一种重要的基于插口API的编程,即UDP插口编程。我们将着重介绍UDP协议机制、UDP插口编程模式。并用具体的例子来说明UDP插口编程中的方法和各种异常情况的处理。同时我们还将介绍两种特殊的UDP插口编程:广播和多播。4-1概述4-1-1UDP协议概述TCP/IP协议栈中的用户数据报协议UDP提供简单的、不可靠的、无连接的数据传输服务。与TCP相比,它比较简单但不可靠。但是,对某些应用程序而言使用UDP比使用TCP更合适,如Internet中的域名

2、系统DNS,网络文件系统NFS,简单网络管理协议SNMP。特别是在今天的局域网环境中,如果不考虑发送方与接收方的处理速度的差异,UDP的可靠性几乎与TCP没有什么区别。由于UDP与TCP的差异,因此利用UDP服务的插口编程与利用TCP服务的插口编程有很大不同。因为不需要建立连接,所以每次发送和接收的数据报都包含了发送方和接收方的地址信息。4-1-2UDP的数据输出过程本节介绍UDP的数据输出过程。因为UDP提供的是不可靠的数据传输服务,因此,UDP插口并没有发送缓存,尽管可以用SO_SNDBUF插口选项来修改插口发送缓存的大小,但对UDP插口

3、而言,缓存大小仅仅表示写到插口的UDP数据报的大小上限。应用进程的数据在沿协议栈向下传递时,以某种形式复制到内核的缓存中,当数据链路层把数据传出去后这个副本就被丢弃。当应用进程调用write时,内核中的UDP从应用进程的缓存中复制所有数据到内存缓存中。UDP简单地加上它的8字节首部以构成PDU并把PDU传递给IP。IP再往下传递。如果UDP应用进程发送一个大的数据报,它比TCP应用更有可能在底层被分片,因为TCP会把应用进程数据划分成MSS大小的块,但UDP却没有这种机制。从写UDP插口的write调用成功地返回表示数据报或所有报文段已被加入

4、到链路层的输出队列。如果输出队列中没有足够的空间来存放数据报或它的某些报文段,UDP将返回错误ENOBUFS给应用进程。需要说明的是,有些UDP的实现并不返回这种错误,在这种实现中,甚至数据报还没有发送就被丢弃的情况应用进程也不知道。因此,使用UDP通信时,应用进程发送的数据不能太长。管理资源吧·管理人自己的下载网站海量管理资源免费下载!4-2基本UDP插口编程4-2-1UDP编程模式图4-1给出了典型的UDP客户-服务器程序所使用的插口函数。对UDP应用而言,如果从通信的角度来看,客户服务器的概念是比较模糊的:任何时候,发送数据的一方可以认

5、为是客户,接收数据的一方是服务器,而不像TCP应用,发起连接的一方为客户,而接收连接的一方称为服务器,自始至终都保持这种关系。当然,可以从应用功能的角度,将提供服务的一方称为服务器,而将申请服务的一方称为客户。图4-1UDP客户-服务器程序的一般通信过程基于UDP的客户与服务器在通信之前不需要建立连接。在数据传送完成之后,需要关闭插口,释放网络资源。在大多数情况下,UDP客户和服务器方调用的插口函数是一样的,按时间顺序如下:(1)打开一个插口(socket)。(2)将插口绑定到指定地址和端口上(bind)。(3)进行数据交换(sendto,r

6、ecvfrom)。(4)数据交换完成,关闭连接(close)。在某些情况下,UDP通信两方中一方可以不绑定指定地址和端口,而是由内核自动分配,但至少有一方是要显示绑定地址和端口的。而且,不绑定地址的一方必须首先向绑定地址的一方(服务器)发送数据,绑定地址和端口的一方从接收到的数据报中获取发送方的地址和端口,用于向没有显式绑定地址和端口的一方发送数据。但大多数情况下,UDP应用都显式地将插口绑定到指定地址和端口上。通常情况下,UDP客户-服务器间数据交换使用的系统调用为sendto和recvfrom管理资源吧·管理人自己的下载网站海量管理资源免

7、费下载!。这两个调用均可指定或返回对方的地址。如果recvfrom的参数源地址参数from是空指针,则相应的源地址长度参数addrlen也必须是空指针,这表示我们并不关心发送数据方的协议地址。这两个函数也可用于TCP,但一般不需要这么使用。我们在第2章中已详细讨论了这两个函数。另外,尽管UDP是面向无连接的通信,但是UDP应用也可以调用connect()函数。但是,此处的connect()的功能并不是向对方发起连接请求(启动三次握手过程),内核只是记录connect()调用中指定的对方的IP地址和端口号,并立即返回给调用进程。在这种情况下,U

8、DP应用使用的数据交换函数就不再是sendto和recvfrom,而是使用TCP应用常用的write(或send)和read(或recv)。我们将在4-2-4节中详

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。