news 2026/6/18 13:31:10

Linux网络编程-UDP 广播原理与实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux网络编程-UDP 广播原理与实战

一、UDP 广播核心概念

UDP 广播是指一台主机向所在子网(同一局域网)内的所有主机发送数据的通信方式,是 UDP 无连接特性的典型应用场景。

1.1 广播地址分类

类型格式 / 示例特点
受限广播地址255.255.255.255① 不会被路由器转发;② 仅同一子网所有主机可接收
直接广播地址(定向广播)如 192.168.10.0/24 的广播地址为 192.168.10.255① 主机段全为 1;② 可被路由转发(默认被路由器阻止,可配置放开);③ 可跨子网广播

二、实操前置注意事项(虚拟机环境)

若通过复制虚拟机搭建多主机测试环境,需解决网卡冲突问题:

  1. 关闭虚拟机,修改虚拟机网卡的物理地址(MAC 地址);
  2. 重启虚拟机,修改 IP 地址配置文件:
    sudo vim /etc/netplan/01-network-manager-all.yaml
  3. 保存配置后生效:
    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 receiver

4.2 测试环境(3 台虚拟机)

  • UDP 广播发送方:192.168.1.168
  • UDP 广播接收方 1:192.168.1.167
  • UDP 广播接收方 2:192.168.1.169

4.3 测试步骤

  1. 在两个接收方虚拟机分别执行:
    ./receiver
  2. 在发送方虚拟机执行:
    ./sender
  3. 接收方会输出类似内容:
    received 21 bytes from 192.168.1.168: 大家好!新年快乐!

总结

  1. UDP 广播核心:发送方需设置SO_BROADCAST属性、用广播地址,无需 bind;接收方必须 bind,地址用INADDR_ANY
  2. 广播地址分两类:受限广播(255.255.255.255)不跨路由,直接广播(如 192.168.10.255)可跨路由(需路由器放行)。
  3. 虚拟机测试需修改 MAC 和 IP,避免网卡冲突,确保多主机在同一子网。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/13 9:19:32

论文初稿难产?10款AI工具助你高效降重与生成,大幅提升写作效率

&#xfffd;&#xfffd; AI工具性能速览表 工具名称 核心功能 处理时间 AI生成率控制 适配检测平台 askpaper 降AIGC率降重同步 20分钟 个位数 知网/格子达/维普 秒篇 AI痕迹深度弱化 20分钟 个位数 知网/格子达/维普 aicheck 全学科初稿生成 20-30分钟 低…

作者头像 李华
网站建设 2026/6/13 16:03:18

【开题答辩全过程】以 基于springbootvue图书馆选座系统设计与实现为例,包含答辩的问题和答案

个人简介 一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等 开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。 感谢大家…

作者头像 李华
网站建设 2026/6/14 4:49:01

子数列求积【牛客tracker 每日一题】

子数列求积 时间限制&#xff1a;1秒 空间限制&#xff1a;256M 网页链接 牛客tracker 牛客tracker & 每日一题&#xff0c;完成每日打卡&#xff0c;即可获得牛币。获得相应数量的牛币&#xff0c;能在【牛币兑换中心】&#xff0c;换取相应奖品&#xff01;助力每日有…

作者头像 李华
网站建设 2026/6/13 0:39:47

Java性能优化实战技术文章大纲性能优化的基本原则

Java性能优化实战技术文章大纲性能优化的基本原则理解性能优化的核心目标&#xff1a;减少资源消耗、提高响应速度、增强系统稳定性 避免过度优化&#xff0c;基于实际业务场景和数据驱动决策 采用可量化的指标评估优化效果&#xff08;如TPS、RT、GC频率等&#xff09;JVM层优…

作者头像 李华
网站建设 2026/6/12 23:23:25

预装智能办公软件,打造企业专属数字工作台

数据成为新生产要素&#xff0c;算法成为新生产力&#xff0c;这场由技术驱动的深层经济逻辑变革&#xff0c;影响着这个时代的每一个人&#xff0c;迫使每一个组织重新审视自己的价值链条与核心竞争力。每个企业需要深化技术与业务流程的结合应用&#xff0c;如何在保障数据主…

作者头像 李华
网站建设 2026/6/17 22:28:39

基于微信小程序的方言粤语文化传播平台的设计与开发PHP_nodejs_vue+uniapp

文章目录方言粤语文化传播平台的设计与开发摘要系统设计与实现的思路主要技术与实现手段源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;方言粤语文化传播平台的设计与开发摘要 该平台基于微信小程序生态&#xff0c;结合PHP、Node.js、V…

作者头像 李华