Linux下的UDP协议编程 刘 畅,彭楚武 (湖南大学电气与信息工程学院,湖南长沙 410082) 摘 要:介绍UDP协议,并提供一个适用于客户端和服务器端 的实例子程序。 关键词:Linux;UDP协议;TCP/IP协议;程序设计 UDP Protocol Program Based on Linux LIU Chang, PENG Chuwu (School of Electrical Engineering, Hunan University, Changsha 410082, China) Abstract: UDP protocol is described in detail in the article and a example program applying to client port and server port is given. Key words: Linux; UDP protocol; TCP/IP protocol; programming 1用户数据报协议(UDP)简介 UDP(User Datagram Protocol)是一个面向数据报的简单传输层协议,它为应用程序发送和 接收数据报。它是一种无连接协议,即它不像TCP那样需要建立服务器与客户端的连接才可 以工作。 UDP是个很简单的协议,它建立在IP协议之上,利用IP数据报提供一种无连接的高效率 的服务。它不保证数据的可靠,不进行重传,时延较短,很适用实时性要求高而不需要数据 绝对可靠的应用。在网络通信质 量较好的情况下,UDP体现出高效率,这适合于传送少量报文的应用,其可靠性由应用程序 来保证,如:接收信号后向源方返回一个回响,超时重发、数据检验等功能需应用程序来实 现。UDP不提供流控制,它按发送方的速率发送数据,而不管接收方的缓存区大小,这 样容易造成溢出错误。由于UDP不存在客户端与服务器的连接,它可用同一个套接字向不 同的目标发送数据报;同样,UDP可以是双向的,所以也可通过同一个套接字从几个不同 的发送源接收数据报。 2套接字编程基础 linux系统是通过套接字来进行网络编程的。下面介绍几个UDP数据报编程用到的基本套接字 函数: 网络程序通过socket和其他几个函数调用,会返回一个用于通信的套接字描述符。Linux应 用程序在执行任何形式的I/O的时候,程序是在读或者写一个文件描述符。因此,我们可以 将创建的套接字描述符看成普通文件的描述符来操作,并可以通过向套接字描述符读写操作 实现网络之间的数据交流,这就是linux设备无关性的好处。 (1)int socket(int domain,int type,int protocol) 函数socket()用于创建一个套接字描述符。参数domain说明网络程序所在的主机采用的通信 协议(AFUNIX和AFINET等)。AFUNIX只能用于单一的UNIX系统 进程间通信,而AFINET是针对Internet的,因而可以允许在远程主机之间通信。 一般把它赋为AFINET。参数type指明创建的套接字类型,对应的参数值为SOCKDGRAM:数据报套接字,表明用的是UDP协议,提供无序的、不可靠的、无连接的通信 。参数protocol,由于指定了type,所以这里一般只要用0来代替即可。 socket() 得到套接字描述符,为网络通信做基本的准备工作,调用成功时将返回文件描述符 ,失败时将返回-1,通过查看error文件可以知道有关出错的详细信息。 (2)int bind(int sockfd,struct sockaddr*myaddr,int addrlen) 得到套接字描述符后,将套接口和机器上的一定的端口号绑定在一起。sockfd是调用socket 函数返回的文件描述符;addrlen是sockaddr结构的长度:myaddr是一个指向sock addr 结构的指针,它保存着本地套接字的地址(即端口和IP地址)信息。不过由于系统兼容性 的问题,一般不使用这个结构,而使用另外一个结构(struct sockaddrin)来代替 。bind()函数在成功被调用时返回0,如果出错返回-1。 结构类型struct sockaddrin保存着套接口的地址信息,定义如下: struct sockaddrin{short int sinfamily;/*地址族*/ unsigned short int sinport;/*端口号*/ struct inaddr sinaddr;/*IP地址*/ unsigned char sinzero[8];}/*填充0以保持与struct sockaddr 同样大小*/ 这个数据结构使得使用其中的各个元素更为方便,sinzero(它用来将sockaddrin结构填充到与sockaddr结构同样的长度)应该用bzero()或memset()函数将其置为0 。另外,一个指向sockaddrin数据结构的指针可以强行转换为一个指向数据结构s ockaddr 的指针,反之亦然。 (3)int close(int sockfd) 函数close用来关闭一个套接字描述符,参数sockfd为指定要关闭的套接字描述符,函数clo se() 在成功执行时返回0,否则返回-1。 以上三个函数中,前两个要包含头文件#include〈sys/types.h〉和#include〈sys/socke t. h〉,后一个包含#include〈unistd.h〉。再介绍两个用于UDP协议的接收和发送函数,包含 头文件#include〈sys/socket.h〉: int sendto(int sockfd,const void*msg,int len,unsigned int flags,struct 3利用UDP数据报编程 UDP协议有自己的通信模型。首先由UDP服务器调用函数socket创建一个数据报类型的套接字 ,然后服务器调用bind函数绑定在一个默认的UDP端口上,接着调用函数recvfrom在指定的 端口上等待UDP客户机数据报的到来。而UDP客户机首先也调用函数socket创建一个数据报类 型的套接字,然后调用函数sendto向UDP服务器发送数据报。需要注意的是,UDP客户机应用 程序通常不需要调用函数bind将套接字绑定到某个固定的端口,linux操作系统会为进程分 配一个空闲的端口号。UDP服务器进程接收到客户机发来的数据报后,将从recvfrom函数中 返回,对数据报进行相关处理后,再调用sendto函数将结果返回到客户端。 通常,客户端的设计和实现比服务器端的要容易一些,典型的UDP服务器与操作系统进行交 互作用,而且大多数需要同时处理多个客户。一个UDP客户机启动后直接与单个服务器通信 ,然后就结束了。而对于服务器来说,它启动后处于休眠状态,等待客户请求的到来。当客 户数据报到达时,服务器苏醒过来,数据报中可能包含来自客户的某种形式的请求消息。一 个基本的UDP通信过程如图1所示。
最后给出一个服务器端的实例子程序,它稍加改造也可应用于客户端: 4结束语 本文介绍了UDP套接字的通信机制。UDP是一个面向数据报的简单传输层协议。建议网络环境 好,要求资源少的采用UDP,如很多实时系统一般采用UDP协议进行数据 的网络传输。如果需要对接收的 UDP 数据报进行排序和流量控制,并保证数据报的可靠性, 则必须在应用程序中增加一些控制机制。 参考文献 [1]Neil Matthew Richard Stones.Beginning Linux Programming, 2ndEdition[Z].Wrox Press,2002. [2]Alessandro Rubini&Jonathan Corbet.Linux设备驱动程序[M].北京:中国 电力出版社,2002. [3]天夜创作室.Linux网络编程技术[M].北京:人民邮电出版社,2001. [4]张威.Linux网络编程教程[M].北京:北京希望电子出版社,2002. 仪表技术 |
Linux下的UDP协议编程
最新推荐文章于 2022-06-03 21:38:36 发布