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

一、UDP 组播核心概念

UDP 通信有三种典型模式,组播是单播和广播的中间形态,能精准向指定一组主机通信,大幅节省网络带宽:

通信模式特点适用场景
单播一对一(两台主机端对端通信)精准的点对点数据传输(如 TCP 连接、UDP 单主机通信)
广播一对所有(向局域网所有主机发数据)需局域网全量通知的场景(如 DHCP 地址分配)
组播一对一组(向特定主机组发数据)音视频流推送、多设备协同等场景

组播核心特性

  1. 一台主机可同时加入多个组播组;
  2. 组播既支持局域网通信,也可用于广域网(需路由器支持组播路由);
  3. 组播 / 广播属性默认关闭,需通过setsockopt()手动开启;
  4. 多播地址仅能作为目的地址,不能作为源地址(和广播地址特性一致);

二、IPv4 组播地址(D 类地址)

IP 组播通信依赖专属的 D 类 IP 地址,范围224.0.0.0 ~ 239.255.255.255,分为三类:

地址分类范围核心特点
局部链接多播地址224.0.0.0 ~ 224.0.0.255① 路由协议 / 特殊用途预留;② 路由器不转发;③ 仅局域网可用,不可用于公网
预留多播地址224.0.1.0 ~ 238.255.255.255① 用户可用的临时组地址;② 可用于 Internet 公网
管理权限多播地址239.0.0.0 ~ 239.255.255.255① 组织内部专用;② 类似私有 IP;③ 不可用于公网

三、UDP 组播代码实现

3.1 发送方(Sender.cpp)

核心要点

  • 无需绑定(bind)端口;
  • 目标地址使用组播地址(示例:224.0.0.88);
  • 循环发送组播数据,模拟持续推送场景。
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> int main(void) { char buf[BUFSIZ]; // 1. 创建UDP套接字 int sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (-1 == sockfd) { perror("socket"); exit(1); } // 2. 配置组播目标地址(组播地址+端口) struct sockaddr_in peer; peer.sin_family = AF_INET; // IPv4协议 peer.sin_port = htons(9000); // 组播端口(需和接收方一致) peer.sin_addr.s_addr = inet_addr("224.0.0.88"); // 组播地址 printf("准备发送组播数据...\n"); // 3. 循环发送组播消息(模拟持续推送) for (int i = 1; ; i++) { sprintf(buf, "新年好,第 %d 次问候!", i); int ret = sendto(sockfd, buf, strlen(buf), 0, (struct sockaddr*)&peer, sizeof(peer)); printf("had send %d bytes: %s\n", ret, buf); sleep(1); // 每秒发送一次 } close(sockfd); // 实际循环不会执行到这里 return 0; }

3.2 接收方(Receiver.cpp)

核心要点

  • 必须绑定(bind)端口和INADDR_ANY地址;
  • 通过IP_ADD_MEMBERSHIP加入指定组播组;
  • 接收指定次数数据后,通过IP_DROP_MEMBERSHIP退出组播组;
  • 测试退出组播组后是否还能接收组播数据。
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> int main(void) { char buf[BUFSIZ]; // 1. 创建UDP套接字 int sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (-1 == sockfd) { perror("socket"); exit(1); } // 2. 绑定端口(接收方必须bind) struct sockaddr_in addr; addr.sin_family = AF_INET; // IPv4协议 addr.sin_port = htons(9000); // 和发送方一致的组播端口 addr.sin_addr.s_addr = INADDR_ANY; // 接收本机所有网卡的组播数据 int ret = bind(sockfd, (struct sockaddr*)&addr, sizeof(addr)); if (-1 == ret) { perror("bind"); exit(1); } // 3. 配置组播组信息(要加入的组播地址+本地网卡) struct ip_mreq req; req.imr_multiaddr.s_addr = inet_addr("224.0.0.88"); // 要加入的组播地址 req.imr_interface.s_addr = INADDR_ANY; // 本机所有网卡 // 4. 加入组播组 ret = setsockopt( sockfd, IPPROTO_IP, // IP层协议 IP_ADD_MEMBERSHIP, // 加入组播组的选项 &req, sizeof(req)); if (ret < 0) { perror("setsockopt(IP_ADD_MEMBERSHIP)"); exit(1); } // 5. 接收10次组播数据(加入组播组期间) printf("已加入组播组,开始接收数据...\n"); for(int i=0; i<10; i++) { struct sockaddr_in from; socklen_t len = sizeof(from); ret = recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr*)&from, &len); printf("【加入组播组】recv from: %s:%d -> %s\n", inet_ntoa(from.sin_addr), ntohs(from.sin_port), buf); } // 6. 退出组播组 ret = setsockopt( sockfd, IPPROTO_IP, IP_DROP_MEMBERSHIP, // 退出组播组的选项 &req, sizeof(req)); if (ret < 0) { perror("setsockopt(IP_DROP_MEMBERSHIP)"); exit(1); } // 7. 测试退出组播组后是否能接收数据(理论上收不到) printf("已退出组播组,尝试接收数据...\n"); for(int i=0; i<10; i++) { struct sockaddr_in from; socklen_t len = sizeof(from); ret = recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr*)&from, &len); printf("【退出组播组】recv from: %s:%d -> %s\n", inet_ntoa(from.sin_addr), ntohs(from.sin_port), buf); } close(sockfd); return 0; }

四、编译与测试

4.1 编译命令

# 编译发送方 g++ Sender.cpp -o sender # 编译接收方 g++ Receiver.cpp -o receiver

4.2 测试步骤

  1. 启动接收方:在 1 台或多台同一局域网的主机上执行接收程序
    ./receiver
  2. 启动发送方:在任意主机执行发送程序
    ./sender
  3. 观察结果
    • 接收方前 10 次能正常收到组播数据;
    • 退出组播组后,后续无法接收组播数据(recvfrom 会阻塞)。

总结

  1. UDP 组播是 “一对一组” 通信,相比广播能大幅节省带宽,支持局域网 / 广域网使用;
  2. 组播依赖 IPv4 D 类地址(224.0.0.0~239.255.255.255),不同段地址有不同使用范围;
  3. 组播接收方必须 bind 端口,且需通过IP_ADD_MEMBERSHIP加入组播组,退出需用IP_DROP_MEMBERSHIP,发送方无需 bind 仅需指定组播地址。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1155750.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入解析 VPC:云端网络架构的核心基石

在云计算的世界里&#xff0c;VPC&#xff08;Virtual Private Cloud&#xff0c;虚拟私有云&#xff09;并非一个单纯的技术术语&#xff0c;它是构建安全、可靠云基础设施的根本前提。许多初学者在接触云服务时&#xff0c;往往直接跳过网络配置去启动虚拟机或数据库&#xf…

基于STM3251单片机的多功能垃圾桶控制系统(程序源码+实物+原理图+PCB+论文+答辩稿)

博主介绍 &#x1f497;CSDN从事毕设辅导第一人&#xff0c;本着诚信、靠谱、质量在业界获得优秀口碑&#xff0c;在此非常希望和行业内的前辈交流学习&#xff0c;欢迎成考学历咨询老师、大学老师前来合作交流&#x1f497; 我们可以做什么&#xff1f; &#x1f31f;拥有的…

Linux命令创意组合大赛技术文章大纲组合的灵活性和强大功能

Linux命令创意组合大赛技术文章大纲引言介绍Linux命令组合的灵活性和强大功能创意组合大赛的目的和意义激发开发者探索命令行工具的潜力比赛规则与评判标准参赛作品需基于常见Linux命令组合需解决实际问题或展示创新思维评判标准&#xff1a;实用性、创意性、效率提升经典命令组…

基于STM3251单片机的两轮平衡车设计(程序源码+实物+原理图+PCB+论文+答辩稿)

博主介绍 &#x1f497;CSDN从事毕设辅导第一人&#xff0c;本着诚信、靠谱、质量在业界获得优秀口碑&#xff0c;在此非常希望和行业内的前辈交流学习&#xff0c;欢迎成考学历咨询老师、大学老师前来合作交流&#x1f497; 我们可以做什么&#xff1f; &#x1f31f;拥有的…

基于AI的智能化学术写作流程,7个平台集成格式规范验证与LaTeX模板库功能

工具快速对比排名&#xff08;前7推荐&#xff09; 工具名称 核心功能亮点 处理时间 适配平台 aibiye 学生/编辑双模式降AIGC 1分钟 知网、万方等 aicheck AI痕迹精准弱化查重一体 ~20分钟 知网、格子达、维普 askpaper AIGC率个位数优化 ~20分钟 高校检测规则通…

SecurityBridge宣布首席执行官更迭,以加速全球扩张

领先的SAP网络安全解决方案供应商SecurityBridge今日宣布任命Jesper Zerlang为首席执行官&#xff0c;2026年1月1日起生效。Zerlang此前担任董事会主席一职&#xff0c;任期12个月。此次任命正值公司进入下一阶段全球扩张之际&#xff0c;BU Bregal Unternehmerkapital (BU) 将…

超越想象:揭秘外星飞碟的“零质量”飞行与时空操控技术

超越想象&#xff1a;揭秘外星飞碟的“零质量”飞行与时空操控技术 在众多关于不明飞行物&#xff08;UFO&#xff09;的目击报告中&#xff0c;碟形飞行器总是最引人注目。它们能悬停、直角转弯、瞬间加速&#xff0c;甚至凭空消失&#xff0c;这些特性挑战着人类现有的物理认…

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

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

Lenovo为零售业提供实时门店可视化与人工智能支持,实现运行首日即创造价值

智能门店服务、原生人工智能零售助手与混合式人工智能服务&#xff0c;助力零售商减少运营中断时间&#xff0c;赋能一线团队&#xff0c;并实现实体店与数字商店的人工智能规模化部署。 每当线上商店出现故障、系统崩溃或一线员工缺乏即时应对工具时&#xff0c;零售商就会损…

结合AI高效完成科研论文写作,这7个网站支持自定义格式与LaTeX模板导出

工具快速对比排名&#xff08;前7推荐&#xff09; 工具名称 核心功能亮点 处理时间 适配平台 aibiye 学生/编辑双模式降AIGC 1分钟 知网、万方等 aicheck AI痕迹精准弱化查重一体 ~20分钟 知网、格子达、维普 askpaper AIGC率个位数优化 ~20分钟 高校检测规则通…

MRM Health获美国FDA新药临床试验申请(IND)批准,启动MH002治疗轻中度溃疡性结肠炎的2b期临床试验

• MH002是目前最先进的活体生物治疗产品(LBP)&#xff0c;其核心成分为经合理设计的疾病特异性细菌组合&#xff08;微生物群落&#xff09;&#xff0c;用于治疗炎症性肠病(IBD) • STARFISH-UC 2b期临床试验旨在验证MH002在2a期研究中观察到的早期疗效信号和良好安全性临床阶…

基于STM3251单片机的Nb-IoT图书馆座位智能管理系统(程序源码+实物+原理图+PCB+论文+答辩稿)

博主介绍 &#x1f497;CSDN从事毕设辅导第一人&#xff0c;本着诚信、靠谱、质量在业界获得优秀口碑&#xff0c;在此非常希望和行业内的前辈交流学习&#xff0c;欢迎成考学历咨询老师、大学老师前来合作交流&#x1f497; 我们可以做什么&#xff1f; &#x1f31f;拥有的…

【开题答辩全过程】以 基于安卓的点餐系统的设计与实现为例,包含答辩的问题和答案

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

通过人工智能快速生成高质量论文,推荐7个提供格式规范及LaTeX兼容的实用网站

工具快速对比排名&#xff08;前7推荐&#xff09; 工具名称 核心功能亮点 处理时间 适配平台 aibiye 学生/编辑双模式降AIGC 1分钟 知网、万方等 aicheck AI痕迹精准弱化查重一体 ~20分钟 知网、格子达、维普 askpaper AIGC率个位数优化 ~20分钟 高校检测规则通…

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

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

Magna AI加入NVIDIA Inception计划,推动生产级人工智能规模化发展

Magna AI是一家由Trend Micro与Wistron的战略合作成立的全球全价值链人工智能转型领导者。公司今日宣布&#xff0c;已加入NVIDIA Inception计划&#xff0c;跻身全球率先实现生产级规模化智能交付的顶尖人工智能机构行列。 Magna AI的加入&#xff0c;体现了其与NVIDIA人工智…

基于AI的智能论文生成方案,7个资源网站包含格式规范检查和LaTeX系统适配

工具快速对比排名&#xff08;前7推荐&#xff09; 工具名称 核心功能亮点 处理时间 适配平台 aibiye 学生/编辑双模式降AIGC 1分钟 知网、万方等 aicheck AI痕迹精准弱化查重一体 ~20分钟 知网、格子达、维普 askpaper AIGC率个位数优化 ~20分钟 高校检测规则通…

RAG到RGA:生成式AI的范式演进

RGA&#xff1a;当检索增强生成迈向自主进化的下一代框架从RAG到RGA&#xff1a;生成式AI的范式演进在深入探讨RGA之前&#xff0c;让我们先回顾一下它演进而来的基础框架——RAG&#xff08;检索增强生成&#xff09;。想象一位准备重要演讲的学者。传统大语言模型如同依赖固定…

基于STM32的养殖场环境检测系统(程序源码+实物+原理图+PCB+论文+答辩稿)

博主介绍 &#x1f497;CSDN从事毕设辅导第一人&#xff0c;本着诚信、靠谱、质量在业界获得优秀口碑&#xff0c;在此非常希望和行业内的前辈交流学习&#xff0c;欢迎成考学历咨询老师、大学老师前来合作交流&#x1f497; 我们可以做什么&#xff1f; &#x1f31f;拥有的…

基于微信小程序的博物馆文创系统的设计与实现PHP_nodejs_vue+uniapp

文章目录摘要系统设计与实现的思路主要技术与实现手段源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;摘要 随着数字化时代的快速发展&#xff0c;博物馆文创产品的线上推广与销售成为文化传播的重要途径。基于微信小程序的博物馆文创系统…