day31 UDP通信
UDP通信原理
服务端和客户端都只需要 创建、绑定、交互、关闭
主要的信息交互是通过recvfrom和sendto实现
伪代码
//1.创建套接字文件
int sfd=socket();
//2.绑定
bind(sfd,(struct sockaddr*)&sin,socklen);
//3.交互
//3.1接收
recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,cocklen);
//3.2发送
sendto(sfd,buf,strlen(buf),0,(struct sockaddr*)&cin,cocklen);
//关闭
close(sfd);
recvfrom
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
struct sockaddr *src_addr, socklen_t *addrlen);
功能:从套接字文件描述符读取数据,并获取对端的网络地址信息
参数1:套接字
参数2:接收数据容器
参数3:接收数据大小
参数4:阻塞状态
参数5:对端通用网络地址信息
参数6:地址信息大小(地址传递)
注意:参数5、6可写NULL但此时只能接收,不能发送
返回值:成功返回读取的字节大小,失败返回-1更新errno
sendto
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);
功能:向套接字文件描述符发送数据,给指定对端
参数1:套接字
参数2:发送数据容器
参数3:发送数据大小
参数4:阻塞状态
参数5:对端通用网络地址信息
参数6:地址信息大小(值传递)
注意:参数5、6必须写
返回值:成功返回发送的字节大小,失败返回-1更新errno
getsockopt &setsockopt
int getsockopt(int sockfd, int level, int optname,
void *optval, socklen_t *optlen);
int setsockopt(int sockfd, int level, int optname,
const void *optval, socklen_t optlen);
功能:设置套接字在不同层上的属性
参数1:套接字
参数2:要设置的层 应用层:SOL_SOCKET
传输层:tcp传输 IPPROTO_TCP
udp传输 IPPROTO_UDP
网络层:IPRROTO_IP
参数3:设置当层的属性名称
参数4:设置的属性值
参数5:属性值的大小
返回值:成功返回0,失败返回-1更新errno