UDP与TCP相比缺少流控制机制,因此UDP通常比TCP要快,,但并非每次都快于TCP,TCP比UDP慢的原因通常有以下两点:
1.收发数据前后进行的连接设置及清除过程
2.收发数据过程中为保证可靠性而添加的流控制
基于UDP的服务器端和客户端
UDP服务器端和客户端不像TCP那样在连接状态下交换数据,因此与TCP不同,无需经过连接过程,即不必调用TCP连接过程中调用的listen函数和accept函数。UDP中只有创建套接字的过程和数据交换的过程。
只需要1个套接字就可以向任意主机发送数据。
基于UDP的数据I/O函数
创建好TCP套接字后,传输数据时无需再添加地址信息。因为TCP套接字将保持与对方套接字的连接。
而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的地址值结构体变量长度
下面是接收UDP数据的函数:
#include<sys/socket.h>
ssize_t recvfrom(int sock,void *buff,size_t nbytes,int flags,struct sockaddr *from,socklen_t *addrlen);
成功时返回接收的字节数,失败时返回-1
sock---用于接收数据的UDP套接字文件描述符
buff---保存接受数据的缓冲地址值
nbytes---可接收的最大字节数,故无法超过参数buff所指的缓冲大小
flags---可选项参数,若没有则传入0
from---存有发送端地址信息的sockaddr结构体变量的地址值
addrlen---保存参数from的结构体变量长度的变量地址值