对于UDP来说,没有了各种乱七八糟的握手挥手,只需要直接接受处理和直接发送就好了。
Server端
- 1、创建套接字
- 2、绑定本机信息
- 3、从哪里接收到信息
- 4、发送信息到接收的信息的地址
对于创建套接字和绑定本地信息,在笔记2、3有所体现。
从哪里接收到的信息所使用的函数:
ssize_t recvfrom(int sockfd,void *buf,size_t nvytes,int flages,struct sockaddr *from ,socklen_t *addrlen);
sockfd : 套接字
buf:接收数据缓冲区
nbytes :接收数据缓冲区大小
flags : 套接字标志
from : 用于存放发送方的信息的地址结构体指针
addlen : from 所指内容的长度
返回接收成功的字节数,失败-1
ssize_t sendto(int sockfd,const void * buf,size_t nbytes,int flags,const struct sockaddr *to,socklen_t addrlen);
sockfd : 套接字
buf:发送数据缓冲区
nbytes :发送数据缓冲区大小
flags : 套接字标志
to : 用于存放要发送给谁的那个人的的地址结构体指针
addlen : to 所指内容的长度
返回接收发送的字节数,失败-1
代码例子:
while(1){
char recv_buf[1024];
char cli_ip[INET_ADDRSTRLEN] = "";
int recv_len = 0;
struct sockaddr_in client_addr;
socklen_t client_addr_len = sizeof(client_addr);
recv_len = recvfrom(sockfd,recv_buf,sizeof(recv_buf),0,(struct sockaddr*)&clien_addr,&client_addr_len);
inet_ntop(AF_INET,&client_addr.sin_addr,cli_ip,INET_ADDRSTRLEN);
printf("client ip = %s\n",cli_ip);
sendto(sockfd,recv_buf,recv_len,0,(struct sockaddr*)&client_addr,client_addr_len);
}
close(sockfd);
传过来的不仅是数据还有发送方的结构体
客户端
1、创建套接字
2、发送数据
3、接收数据
4、关闭
-发送数据和接收数据的函数都是一个函数,recvfrom和sendto
但是要在发送之前创建一个地质结构体,目的是给哪个发送。作为一个客户端,必须是给服务器进行发送的。所以这个地址结构体的作用就是存放服务器的信息。需要注意的是,对于客户端来说是接收数据,并且不关心数据的来源的。所以recvfrom函数里面的参数的addr地址是空,长度也是空。
广播
使用的函数为
int setsockopt(int sockfd,int level,int optname,const void *optval,socklen_t optlen);
其中的level 填写SOL_SOCKET
optname有三个选项
1、SO_BROADCAST,允许发送广播数据包。
2、SO_RCVBUF ,接收缓冲区大小
3、SO_SNDBUF ,发送缓冲区大小
optval的意思是分别对optname的三个选项进行控制。
1、对于第一个允许发送广播数据包来说,1就是可以,0就是不行。
2、对于第二个来说设置的大小就是缓冲区的大小。
optlen的含义就是optval的长度。