UDP通信
- 1、UDP
- 2、UDP通信流程
1、UDP
/*
udp传输层协议,和tcp是一样的
特点:面向无连接的,不安全的,报式传输协议1.无连接:ldp通信的时候不需要connect1) 通信不需要建立连接2) 如果想给对方发送数据,只需要指定对方的IP和端口2. udp会丢包1) 数据丢失了就没有了,没有数据校验机制2) udp不会丢失一部分数据,丢就是全丢,不丢就是一点不不丢3.报式:发送端发送多少数据,接牧端接收多少数据|
*/
2、UDP通信流程
udp通信过程中,服务器和客户端做的操作几乎是一样的
- 服务器端
// 1. 创建一个通信的套接字 AF_INET使用IPv4
int cfd = socket(AF_INET,SOCK_DGRAM,0); //通信使用udp
// 2.通信的套接字和本地的IP和端口绑定
// 绑定的目的:程序启动之后不主动发送数据,先接收数据,就需要绑定端口
// 如果不手动绑定端口,就会自动绑定端口,主动发送数据,可以自动绑定端口
struct sockaddr_in addr ;
bind(cfd, (struct sockaddr* )&addr, sizeof(addr) );
// 3.通信
接收数据:recvfrom( ) ;
发送数据:sendto();
// 4. 关闭通信的文件描述符
close();
- 客户端
// 1. 创建一个通信的套接字
int cfd = socket(AF_INET,SOCK_DGRAM,0); //通信使用udp
// 2.通信的套接字和本地的IP和端口绑定
// 绑定的目的:程序启动之后不主动发送数据,先接收数据,就需要绑定端口
// 如果不手动绑定端口,就会自动绑定端口
struct sockaddr_in addr ;
bind(cfd, (struct sockaddr* )&addr, sizeof(addr) );
// 3.通信
接收数据:recvfrom( ) ;
发送数据:sendto();
// 4. 关闭通信的文件描述符
close();
- 操作函数
//接收数据
ssize_t recvfrom( int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen) ;
参数∶- sockfd:通信的文件描述符- buf:指向一块有效内存地址,存储接收的数据- len:参数buf指向的内存大小- flags:使用默认属性,指定为0即可- src_addr:传出参数,保存发送端的地址信息(IP和端口)->大端(网络字节序)- 对发送端的地址不感兴趣,可以指定为NULL- addrlen:传入传出参数,类似于accept()最后一个参数- src_addr为NULL,该参数也指定为NULL即可
返回值:>0:接收的字节数-1:失败//发送数据函数
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);
参数:- sockfd:通信的文件描述符- buf:指向一块有效内存地址,内存中存储了待发送的数据- len:参数buf指向的内存中待发送的数据长度- flags:使用默认属性,指定为0即可- dest_addr:传入参数,保存接收端的地址信息(IP和端口)->大端(网络字节序)- addrlen:传入参数,dest_addr参数指向的内存大小
返回值:>0: 发送的字节数-1:失败