目录
1. udp
1.1 udp通信流程
- - 服务器端
- 1.创建通信的套接字
- int fd = socket( af_inet, SOCK_DGRAM, 0)
- 2. 绑定 -> 通信的fd 和本地 IP / port 绑定
- struct sockaddr_in addr;
- 3.通信
- 接收数据: recvfrom
- 发送数据: sendto
- 4.关闭通信的fd
- close(fd);
- - 客户端
- 1.创建一个通信的套接字
- 2.通信
- 接收数据: recvfrom
- 发送数据: sendto
- 3.关闭通信的文件描述符
- close();
1.2 操作函数
-
send、sendto
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h> //也可以只用这一个头文件,包含了上面2个头文件
// tcp 发送数据的函数 write
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
// udp 发送数据
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);
参数:
- sockfd: 通信的fd
- buf: 要发送的数据
- len: 要发送的数据的长度
- flags: 0
- dest_addr: 通信的另外一端的地址信息
- addrlen: dest_addr的内存大小
-
recv、recvfrom
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h> //也可以只用这一个头文件,包含了上面2个头文件
// tcp 接收数据 read
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
// udp 接收数据函数
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
struct sockaddr *src_addr, socklen_t *addrlen);
参数:
- sockfd: 通信的fd
- buf: 接收数据的一块内存
- len: 接收数据的内存(第二个参数)大小
- flags: 0
- src_addr: 接收谁的数据, 就写入了那个终端的地址信息, 如果不要这部分数据 -> NULL
- addrlen: src_addr参数对应内存大小(传入传出参数)
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
2. 广播
向子网中多台计算机发送消息,并且子网中所有的计算机都可以接收到发送方发送的消息。
- 只能在局域网中使用
- 客户端只要绑定了服务器广播使用的端口, 就可以接收到广播数据
2.1 广播通信流程
服务器端 -> 广播的一端:
- - 创建通信的套接字
int fd = socket( af_inet, SOCK_DGRAM, 0);
- - 设置udp广播属性
setsockopt();
- - 通信 -> 发送广播数据
struct sockaddr_in cliaddr;
cliaddr.sin_port(8888); // 广播数据发送到客户端的8888端口, 客户端需要绑定该端口
cliaddr.sin_addr.s_addr -> 初始化一个广播地址
发送数据: sendto(fd, buf, len, 0, &cliaddr, len);
- - 关闭通信的fd
close(fd);
客户端
- - 创建一个通信的套接字
int fd = socket( af_inet, SOCK_DGRAM, 0);
- - 如果想接收广播数据, 需要绑定以固定端口(服务器广播数据使用的端口)
struct sockaddr_in cliaddr;
cliaddr.sin_port(8888);
bind(fd, cliaddr, len);<