一、实现基于UDP的服务器端/客户端
1.1 UDP中的服务器端和客户端没有连接
UDP服务器端/客户端不像TCP那样在连接状态下交换数据,因此与TCP不同,无需经过连接过程。也就是说,不必调用TCP连接过程中调用的listen函数和accept函数。UDP中只有创建套接字的过程和数据交换过程。
1.2 UDP服务器端和客户端均只需一个套接字
TCP中,套接字之间应该是-对- -的关系。若要向10个客户端提供服务,则除了守门的服务器套接字外,还需要10个服务器端套接字。但在UDP中,不管是服务器端还是客户端都只需要1个套接字。如图6-2所示:
图6-2展示了1个UDP套接字与2个不同主机交换数据的过程。也就是说,只需1个UDP套接字就能和多台主机通信。
1.3 基于UDP的数据I/O函数
创建好TCP套接字后,传输数据时无需再添加地址信息。因为TCP套接字将保持与对方套接字的连接。换言之,TCP套接字知道目标地址信息。但UDP套接字不会保持连接状态( UDP套接字只有简单的邮筒功能),因此每次传输数据都要添加目标地址信息。这相当于寄信前在信件中填写地址。接下来介绍填写地址并传输数据时调用的UDP相关丽数。
#include<sys/socket.h>
ssize_t sendto(int sock, void *buff, size_t nbytes,
int flags, struct sockaddr *to, socklen_t addrlen);
成功时返回传输的字节数,失败时返回-1
- sock:用于传输数据的UDP套接字文件描述符
- buff:保存待传输数据的缓冲地址值
- nbytes:待传输的数据长度,以字节为单位
- flags:可选项参数,若没有则传递0
- to:存有目标地址信息的sockaddr结构体变量的地址值
- addrlen:传递给参数to的地址值结构体变量长度
上述丽数与之前的TCP输出丽数最大的区别在于,此丽数需要向它传递目标地址信息。接下来介绍接收UDP数据的函数。UDP数据的发送端并不固定,因此该函数定义为可接收发送端信息的形式,也就是将同时返回UDP数据包中的发送端信息。