欢迎来到天天文库
浏览记录
ID:58664663
大小:560.00 KB
页数:133页
时间:2020-10-05
《网络应用程序设计(方敏)第3章_UDP套接字与原始套接字的编程ppt课件.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第3章UDP套接字与原始套接字的编程3.1概述3.2UDP套接字编程3.3连接UDP套接字的功能3.4UDP编程中的错误检测及处理方法3.5UDP套接字在OICQ服务中的应用3.6原始套接字3.7服务器编程模型习题3.1概述Internet协议簇支持一个面向无连接的传输协议用户数据报协议(UDP,UserDatagramProtocol)。UDP协议向应用程序提供了一种发送经过封装的IP数据报的方法,而且不需要在发送方和接收方之间建立连接就可以进行数据报通信。UDP协议与TCP协议提供的服务不同,所以基于UDP协议的应用程序同基于TCP的应用程序有不相同的地
2、方,它们的编程模型也不相同。图3-1给出了典型的UDP客户机/服务器程序的函数调用模型。图3-1UDP客户机/服务器程序的编程模型在前面的章节中,已经介绍了基于TCP套接字编程的函数调用模型,比较TCP和UDP编程模型可以看出,UDP协议不需要事先在客户机、服务器程序之间建立连接。服务器端在调用socket函数生成一个UDP套接字后,利用bind函数将套接字与本地IP、端口号绑定,然后,服务器端调用recvfrom函数等待接收由客户端发送来的数据。客户机首先调用socket函数创建一个UDP套接字,然后利用sendto函数将请求包发送至服务器端;服务器端收到
3、请求包后,根据请求进行处理,调用sendto函数将处理结果作为应答数据发送给客户机。客户机调用recvfrom函数接收服务器端发送来的应答数据。当通信结束后,客户机调用close函数关闭UDP套接字,而服务器端可以保留已建立的UDP套接字继续与其他客户机进行数据通信。3.2UDP套接字编程3.1节中已介绍了基于UDP协议网络编程的一般模型,其中涉及到了在套接字编程中曾简单介绍过的数据报发送和接收函数sendto和recvfrom,下面我们列出可用于数据报发送、接收的高级套接字函数。这些函数是:#include#include4、/socket.h>#includeintsendto(intfd,char*buf,intlen,intflags,structsockaddr*toaddr,intaddrlen);intrecvfrom(intfd,char*buf,intlen,intflags,structsockaddr*fromaddr,intaddrlen);intsendmsg(intfd,structmsghdr*msgp,intflags);intrecvmsg(intfd,structmsghdr*msgp,intflags);UDP套接字在通信5、中发送和接收的数据是以数据报为单位的。当应用程序调用函数sendto发送数据时,首先应将数据封装生成一个UDP数据报,然后发送;当应用程序调用函数recvfrom接收数据时。UDP协议将返回一个完整的UDP数据报数据内容。在使用UDP套接字进行编程时,我们必须注意以下几个问题:(1) UDP套接字在发送数据时不会因发送缓冲区而出现阻塞。UDP协议没有专门为UDP套接字设置发送缓冲区,当应用程序通过调用函数sendto来发送数据时,该函数将要发送的数据从用户缓冲区拷贝到系统缓冲区,然后返回。UDP协议进一步把数据封装成一个UDP数据报,然后将这个UDP数据报传6、送给低层的IP协议,从而完成UDP数据报的发送任务。UDP协议是不可靠的协议,它没有必要保留已经发送的UDP数据报内容。所以,UDP套接字只有一个发送缓冲区大小,而这个大小就是可以发送的UDP数据报的最大长度。如果应用程序发送的数据量大于这个限制值,函数sendto将以错误返回,错误类型是EMSGSIZE。UDP套接字的发送缓冲区大小是不会发生变化的,所以,只要应用程序保证调用函数sendto发送的数据量小于这个限制值,发送操作总能够成功。因此,应用程序使用UDP套接字发送数据时,不会因发送缓冲区而出现阻塞。图3-2UDP套接字接收缓冲区UDP套接字的接收缓7、冲区的大小是有限制的,当接收到新的UDP数据报时,如果这个UDP套接字的接收缓冲区队列已经满了,那么UDP协议将丢弃这个数据报,并且不向发送方返回任何错误信息。这种操作也是由UDP协议不保证接收数据的可靠性的特点所决定的。(3) UDP服务器采用循环服务器的工作方式,不会被某一个客户机独占,但客户机可能被阻塞。UDP通信模式中,服务器一般采用循环服务器工作模式。在服务器与客户机之间不需要建立连接,UDP服务器能够交替地处理来自多个客户机的请求,这就意味着服务器在前后两次循环处理的请求可以是不同客户机的请求,任何一个客户机都无法独占服务器。(4)发送数据时需指8、定接收方的地址。UDP套接字是面向无连接的套接字的,
4、/socket.h>#includeintsendto(intfd,char*buf,intlen,intflags,structsockaddr*toaddr,intaddrlen);intrecvfrom(intfd,char*buf,intlen,intflags,structsockaddr*fromaddr,intaddrlen);intsendmsg(intfd,structmsghdr*msgp,intflags);intrecvmsg(intfd,structmsghdr*msgp,intflags);UDP套接字在通信
5、中发送和接收的数据是以数据报为单位的。当应用程序调用函数sendto发送数据时,首先应将数据封装生成一个UDP数据报,然后发送;当应用程序调用函数recvfrom接收数据时。UDP协议将返回一个完整的UDP数据报数据内容。在使用UDP套接字进行编程时,我们必须注意以下几个问题:(1) UDP套接字在发送数据时不会因发送缓冲区而出现阻塞。UDP协议没有专门为UDP套接字设置发送缓冲区,当应用程序通过调用函数sendto来发送数据时,该函数将要发送的数据从用户缓冲区拷贝到系统缓冲区,然后返回。UDP协议进一步把数据封装成一个UDP数据报,然后将这个UDP数据报传
6、送给低层的IP协议,从而完成UDP数据报的发送任务。UDP协议是不可靠的协议,它没有必要保留已经发送的UDP数据报内容。所以,UDP套接字只有一个发送缓冲区大小,而这个大小就是可以发送的UDP数据报的最大长度。如果应用程序发送的数据量大于这个限制值,函数sendto将以错误返回,错误类型是EMSGSIZE。UDP套接字的发送缓冲区大小是不会发生变化的,所以,只要应用程序保证调用函数sendto发送的数据量小于这个限制值,发送操作总能够成功。因此,应用程序使用UDP套接字发送数据时,不会因发送缓冲区而出现阻塞。图3-2UDP套接字接收缓冲区UDP套接字的接收缓
7、冲区的大小是有限制的,当接收到新的UDP数据报时,如果这个UDP套接字的接收缓冲区队列已经满了,那么UDP协议将丢弃这个数据报,并且不向发送方返回任何错误信息。这种操作也是由UDP协议不保证接收数据的可靠性的特点所决定的。(3) UDP服务器采用循环服务器的工作方式,不会被某一个客户机独占,但客户机可能被阻塞。UDP通信模式中,服务器一般采用循环服务器工作模式。在服务器与客户机之间不需要建立连接,UDP服务器能够交替地处理来自多个客户机的请求,这就意味着服务器在前后两次循环处理的请求可以是不同客户机的请求,任何一个客户机都无法独占服务器。(4)发送数据时需指
8、定接收方的地址。UDP套接字是面向无连接的套接字的,
此文档下载收益归作者所有