UDP编程简介
TCP和UDP在传输层区别
UDP是无连接不可靠的数据报协议。TCP提供面向连接的可靠字节流。使用UDP常见应用
DNS(域名系统),NFS(网络文件系统),SNMP(简单网络管理协议)
典型的UDP的Client和Server
(1)客户端不和服务器建立连接,只是使用sendto给服务器发送数据,必须指定服务器地址作为参数。
(2)服务器不接受来自客户端的连接,而只是使用recvfrom,等待来自客户端的数据达到。recvfrom同时返回
客户端的协议地址,用于服务器给客户端响应。
UDP Client UDP服务器
socket()
|
|
bind()众所周知端口
|
|
socket() recvfrom() <----------
| | |
| 数据请求 | |
--->sendto() -----------------> 阻塞,直到收到数据 |
| | | |
| | | |
| | 处理请求 |
| | | |
| | | |
| | 数据应答 | |
|---recvfrom() <----------------- sendto() ------------
|
|
|
close()
重要函数recvfrom和sendto
recvfrom函数:
#include <sys/socket.h>
ssize_t recvfrom(int sockfd,void* buff,size_t nbytes,int flags,struct sockaddr* from,socklen_t *addrlen);
参数:sockfd : 套接字描述符
buff : 用于存放数据的缓冲区
nbytes : 缓冲区大小
flags : 暂时总设置为0
from : 用于存放UDP对端的套接字协议地址(输出参数)
addrlen : UDP对端的套接字协议地址字节大小(输出参数)
注意:最后两个参数from和addrlen可以得知该UDP数据是谁发送过来的。
如果设置from和addrlen为NULL,表示我们忽略对端信息。
返回值:
成功返回读取到的字节数,出错返回-1。返回值0是被允许的,不同于TCP中read返回0表示对端已经关闭。
sendto函数:
#include <sys/socket.h>
ssize_t sendto(int sockfd,const void* buff,size_t nbytes,int flags,const struct sockaddr* to,socklen_t *addrlen);
参数:sockfd : 套接字描述符
buff : 要发送的数据内存
nbytes : 数据大小
flags : 暂时总设置为