2026/3/28 23:09:37
网站建设
项目流程
关于电子商务网站建设的参考文献,wordpress 链接地址,网站用静态域名解析,郑州哪家公司做网站一、UDP 广播核心概念
UDP 广播是指一台主机向所在子网#xff08;同一局域网#xff09;内的所有主机发送数据的通信方式#xff0c;是 UDP 无连接特性的典型应用场景。
1.1 广播地址分类
类型格式 / 示例特点受限广播地址255.255.255.255① 不会被路由器转发#xff1…一、UDP 广播核心概念UDP 广播是指一台主机向所在子网同一局域网内的所有主机发送数据的通信方式是 UDP 无连接特性的典型应用场景。1.1 广播地址分类类型格式 / 示例特点受限广播地址255.255.255.255① 不会被路由器转发② 仅同一子网所有主机可接收直接广播地址定向广播如 192.168.10.0/24 的广播地址为 192.168.10.255① 主机段全为 1② 可被路由转发默认被路由器阻止可配置放开③ 可跨子网广播二、实操前置注意事项虚拟机环境若通过复制虚拟机搭建多主机测试环境需解决网卡冲突问题关闭虚拟机修改虚拟机网卡的物理地址MAC 地址重启虚拟机修改 IP 地址配置文件sudo vim /etc/netplan/01-network-manager-all.yaml保存配置后生效sudo netplan apply三、UDP 广播代码实现3.1 发送方Sender.cpp核心要点无需绑定bind端口必须通过setsockopt设置SO_BROADCAST属性允许广播目标地址使用广播地址如 255.255.255.255。#include stdio.h #include unistd.h #include sys/socket.h #include arpa/inet.h #include netinet/in.h #include string.h #include stdlib.h int main(void) { // 1. 创建UDP套接字 int sockfd socket(AF_INET, SOCK_DGRAM, 0); if (sockfd -1) { perror(socket failed.); exit(1); } // 2. 设置套接字属性允许发送广播 int opt 1; setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, // 广播发送属性 opt, // 非0允许广播0禁止广播 sizeof(opt)); // 3. 配置广播目标地址和端口 struct sockaddr_in senderAddr; senderAddr.sin_family AF_INET; // IPv4协议 senderAddr.sin_port htons(9999); // 广播端口需和接收方一致 senderAddr.sin_addr.s_addr inet_addr(255.255.255.255); // 受限广播地址 // 4. 发送广播消息 printf(send broadcast...\n); char buff[BUFSIZ] 大家好新年快乐; int ret sendto(sockfd, buff, strlen(buff) 1, 0, (struct sockaddr*)senderAddr, sizeof(senderAddr)); if (ret 0) { perror(sendto failed.); } else { printf(had send broadcast %d bytes: %s\n, ret, buff); } // 5. 关闭套接字 close(sockfd); return 0; }3.2 接收方Receiver.cpp核心要点必须绑定bind端口和地址地址用INADDR_ANY接收所有网卡数据端口需和发送方一致通过recvfrom阻塞接收广播数据并获取发送方 IP。#include stdio.h #include unistd.h #include sys/socket.h #include arpa/inet.h #include netinet/in.h #include string.h #include stdlib.h int main(void) { // 1. 创建UDP套接字 int sockfd socket(AF_INET, SOCK_DGRAM, 0); if (sockfd -1) { perror(socket failed.); exit(1); } // 2. 配置接收方地址绑定所有网卡指定端口 struct sockaddr_in receiverAddr; receiverAddr.sin_family AF_INET; // IPv4协议 receiverAddr.sin_port htons(9999); // 和发送方一致的端口 receiverAddr.sin_addr.s_addr INADDR_ANY; // 接收本机所有网卡的UDP数据 // 3. 绑定端口广播接收方必须绑定 int ret bind(sockfd, (struct sockaddr*)receiverAddr, sizeof(receiverAddr)); if (ret -1) { perror(bind failed.); exit(1); } // 4. 阻塞接收广播数据 char buff[BUFSIZ]; socklen_t len sizeof(receiverAddr); ret recvfrom(sockfd, buff, sizeof(buff), 0, (struct sockaddr*)receiverAddr, len); if (ret 0) { perror(recvfrom failed.); exit(1); } // 5. 解析并打印发送方IP和接收的数据 char ipaddr[64]; const char* result inet_ntop(AF_INET, receiverAddr.sin_addr, ipaddr, sizeof(ipaddr)); if (result nullptr) { printf(IP 地址转换失败\n); } printf(received %d bytes from %s: %s\n, ret, ipaddr, buff); // 6. 关闭套接字 close(sockfd); return 0; }四、编译与测试4.1 编译命令# 编译发送方 g Sender.cpp -o sender # 编译接收方 g Receiver.cpp -o receiver4.2 测试环境3 台虚拟机UDP 广播发送方192.168.1.168UDP 广播接收方 1192.168.1.167UDP 广播接收方 2192.168.1.1694.3 测试步骤在两个接收方虚拟机分别执行./receiver在发送方虚拟机执行./sender接收方会输出类似内容received 21 bytes from 192.168.1.168: 大家好新年快乐总结UDP 广播核心发送方需设置SO_BROADCAST属性、用广播地址无需 bind接收方必须 bind地址用INADDR_ANY。广播地址分两类受限广播255.255.255.255不跨路由直接广播如 192.168.10.255可跨路由需路由器放行。虚拟机测试需修改 MAC 和 IP避免网卡冲突确保多主机在同一子网。