1. UDP
// udp -> QUdpSocket
// Tcp -> QTcpServer (监听) QTcpSocket(通信)
1.1 UDP通信
udp通信不需要建立连接
UDP: 面向无连接的, 不安全(会丢失数据)的, 报文传输
-
操作函数
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); // 接收数据 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, Port, 地址族协议 -> 传出参数 - addrlen: 传入传出参数, src_addr 对应的内存大小 // 发送数据 ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen); 参数: - sockfd: 通信的文件描述符 - buf: 存储了要发送到数据 - len: 要发送的数据的长度 -> 通过strlen() 计算 - flags: 写0, 使用默认属性 - dest_addr: 接收数据的一方的地址信息 - addrlen: 传入, dest_addr对应的内存大小
-
通信流程
// 服务器端 1. 创建用于通信的套接字 -> 使用报式协议( SOCK_DGRAM ) int cfd = socket(af_inet, SOCK_DGRAM, 0); 2. 绑定本地的IP和端口 和 用于通信的套接字绑定 bind(); 3. 通信 - 接收数据: recvfrom - 发送数据: sendto 4. 关闭连接: close(cfd);
// 客户端通信流程: 1. 创建用于通信的套接字 -> 使用报式协议( SOCK_DGRAM ) int cfd = socket(af_inet, SOCK_DGRAM, 0); 2. 通信 - 接收数据: recvfrom - 发送数据: sendto 3. 关闭连接: close(cfd);
1.2 广播
向子网中多台计算机发送消息,并且子网中所有的计算机都可以接收到发送方发送的消息,每个广播消息都包含一个特殊的IP地址,这个IP中子网内主机标志部分的二进制全部为1。
- 只能在局域网中使用
- 客户端只要绑定了服务器广播使用的端口, 就可以接收到广播数据