网络编程 | UDP组播通信

1、什么是组播

        在上一篇博客中,对UDP的广播通信进行了由浅入深的总结梳理,本文继续对UDP的知识体系进行探讨,旨在将UDP的组播通信由浅入深的讲解清楚。

        组播是介于单播与广播之间,在一个局域网内,将某些主机添加到组中,并设置一个组地址。将数据发送到组播地址时,加入到该组的所有主机都能接收到数据。

        组播、单播和广播都是报文传输的一种方式。

        单播是主机间一对一的通信模式,设备只会将数据发送到唯一指定的接收者。

        广播是主机间一对所有的通信模式,设备会将数据发送到网络中的所有可能的接收者。设备简单地将它收到的任何广播报文都复制并转发到除该报文到达的接口外的每个接口。广播处理流程简单,不用选择路径。

        组播是主机间一对多的通信模式, 组播是一种允许一个或多个组播源发送同一报文到多个接收者的技术。类似于生活中较为常见的群聊功能,在群内的所有群员,都可以在群内发送消息给群友,也可以接收到来自任意群友的消息。

        为了帮助读者更进一步的理解UDP的单播、组播和广播功能,绘制了如下所示的总结图。

2、IP地址分类

        因为组播通信需要设置IP地址,且必须是D类IP地址,但是考虑到每位博客读者的基础不同,知识贮备有较大差距,所以在这一小部分,简单讲解一下IP地址的分类及用途,在后面程序设计中需要用到这个E类IP地址。

        IP地址 = 网络号 + 主机号

        网络号:指的是不同的网络

        主机号:指的是同一个网段下用来识别不同的主机。那也就是说,主机号所占的位数越多,在该网段下的主机数越多。

A类地址:保留给政府机构使用

        A类IP地址就由1字节的网络地址和3字节主机地址组成,网络地址的最高位必须是“0”

        A类地址范围 1.0.0.1 - 126.255.255.254

B类地址:分配给中等规模的公司

        B类IP地址就由2字节的网络地址和2字节主机地址组成,网络地址的最高位必须是“10”。

        B类地址范围 128.0.0.1 - 191.255.255.254

C类地址:分配给任何需要的人

        C类IP地址就由3字节的网络地址和1字节主机地址组成,网络地址的最高位必须是“110”。

        C类地址范围 192.0.0.1 - 223.255.255.254

D类地址:用于组播

        组播地址不同于单播地址,它并不属于特定某个主机,而是属于一组主机。一个组播地址表示一个群组,需要接收组播报文的接收者都加入这个群组。

        D类地址范围 224.0.0.1 - 239.255.255.254

E类地址:用于实验

        E类地址范围 240.0.0.1 - 255.255.255.254

特殊地址:每一个字节都为0的地址(“0.0.0.0”)对应于当前主机; INADDR_ANY —>代表当前主机所有的地址

        127.0.0.1 回环地址 —> 在当前主机内部自动形成闭环的网络 —> 主要用于主机内部不同的应用程序间通信

        如果已经确定当前客户端 和 服务器 都是在同一台主机上运行,那么可以使用本地回环地址

3、组播的特点及应用

(1)、特点

  • 效率高:组播传输的数据包只需要经过一次发送操作,就可以同时传输到多个接收者,可以有效地降低网络传输的负载。
  • 可扩展性:组播支持动态加入和退出组播组,能够自适应地处理组播成员的加入和离开。
  • IP组播地址:在IPv4中,组播使用D类地址(224.0.0.0至239.255.255.255),而在IPv6中,组播地址以ff00::/8开头。这些特殊地址用于标识不同的组播组,使路由器能够识别并正确转发组播报文。
  • 路由协议的支持:为有效管理组播流量,互联网工程任务组(IETF)定义了几种专门的组播路由协议,如PIM(Protocol Independent Multicast)、DVMRP(Distance Vector Multicast Routing Protocol)等,它们帮助确定最有效的路径来分发组播数据。
  • 不可靠性:与普通的UDP一样,组播只提供不可靠的数据传输服务。如果某个接收者没有接收到数据包,发送者不会得到任何提示或反馈信息。

(2)、应用

  • 多媒体流媒体:在局域网或广域网上传输音视频流,快速向多个接收者发送相同的视频和音频数据。
  • 分布式应用的数据分发:实现高效的数据分发,例如在大型集群环境下广播服务的状态信息。
  • 网络游戏:用于多人联机游戏,使多个玩家能够同时收到相同的游戏状态和动作。
  • 网络广播:向多个设备广播事件和消息,例如路由器向所有连接的设备发送网络配置信息。
  • 实时数据更新:用于实时的数据更新,例如在金融行业订阅财经数据的实时更新。

4、组播的通信流程

        组播通信的发送端程序与普通UDP发送端创建流程几乎一致,区别在于,其目标IP地址需要换成D类IP地址。

        组播通信的接收端则是需要在普通UDP接收端程序的基础上,增加一步“加群”的操作,即将当前的IP地址设置到组播地址中

5、组播通信的程序

(1)、组播发送端步骤

①、创建UDP套接字

int socketfd = socket(AF_INET,SOCK_DGRAM,0);

②、发送数据,往组播地址(224.0.0.10 )里面发送数据

struct sockaddr_in sendAddr;//IPV4地址结构体变量 
sendAddr.sin_family = AF_INET; 
sendAddr.sin_port = htons(GROUPPORT); 
sendAddr.sin_addr.s_addr = inet_addr(GROUPADDR);//一定是组播地址 
sendto(socketfd, buf, strlen(buf), 0, (struct sockaddr *)&sendAddr, sizeof(sendAddr));

③、关闭套接字

close(socketfd);

(2)、组播接收端步骤

①、创建UDP套接字

int socketfd = socket(AF_INET, SOCK_DGRAM, 0);

②、设置组播ip(初始化 组播结构体)

函数原型:#include <arpa/inet.h>int inet_pton(int af, const char *src, void *dst);//函数原型
函数参数:af: 你要选择哪一种协议族  IPV4 --》AF_INET  还是 IPV6--》AF_INET6src: 本地IP地址dst:将本地IP地址转为网络IP地址存储到这里
函数功能:将本地IP地址转为网络IP地址
函数返回值:成功返回0, 失败返回-1//配置方法
struct ip_mreq vmreq;
inet_pton(AF_INET, "224.0.0.10", &vmreq.imr_multiaddr); // 组播地址
inet_pton(AF_INET, "192.168.63.2", &vmreq.imr_interface); // 需要添加到组的ip

③、加入组播属性(设置套接字 可以接收组播信息)

setsockopt(socketfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &vmreq, sizeof(vmreq));

④、绑定地址

struct sockaddr_in saddr;
saddr.sin_family = AF_INET;
saddr.sin_port = htons(atoi(argv[1]));
saddr.sin_addr.s_addr = htonl(INADDR_ANY); //htonl(INADDR_ANY)  代表 主机所有的地址
bind(socketfd, (struct sockaddr *)&saddr, sizeof(saddr));

⑤、接收数据

recvfrom(......)

(3)、组播实现程序

①、组播发送端

#include<stdio.h>
#include <sys/types.h>  
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>#define GROUPADDR   "224.0.0.10" //组播地址
#define GROUPPORT   10000int main()
{printf("组播发送端.....\n");//1、创建UDP数据报套接字int socketfd = socket(AF_INET,SOCK_DGRAM,0);if(socketfd == -1){perror("socket error");return -1;}//2、发送数据,往组播地址(224.0.0.10 )里面发送数据struct sockaddr_in sendAddr;//IPV4地址结构体变量sendAddr.sin_family = AF_INET;sendAddr.sin_port = htons(GROUPPORT);sendAddr.sin_addr.s_addr = inet_addr(GROUPADDR);//一定是组播地址while(1){char buf[1024]={0};printf("data:");scanf("%s",buf); sendto(socketfd,buf,strlen(buf),0,( struct sockaddr *)&sendAddr,sizeof(sendAddr));}//3、关闭 close(socketfd);return 0;
}

②、组播接收端

#include<stdio.h>
#include <sys/types.h>     
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>#define OWNADDR "192.168.112.109" //接收端的IP地址   当前ubuntu的IP地址
#define GROUPADDR   "224.0.0.10"  //组播地址
#define GROUPPORT   10000int main()
{printf("组播接收端.....\n");//1、创建UDP套接字int socketfd = socket(AF_INET,SOCK_DGRAM,0);if(socketfd == -1){perror("socket error");return -1;}//2、定义组播结构体struct ip_mreq vmreq;//3、设置组播ip(初始化 组播结构体)inet_pton(AF_INET,GROUPADDR,&vmreq.imr_multiaddr); // 组播地址inet_pton(AF_INET,OWNADDR,&vmreq.imr_interface); // 需要添加到组的ip//4)加入组播属性(也就是设置这个套接字 可以接收组播信息)setsockopt(socketfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&vmreq,sizeof(vmreq));//5)绑定地址struct sockaddr_in saddr;saddr.sin_family = AF_INET;saddr.sin_port = htons(GROUPPORT);saddr.sin_addr.s_addr = htonl(INADDR_ANY); //htonl(INADDR_ANY)  代表 主机所有的地址bind(socketfd,(struct sockaddr *)&saddr,sizeof(saddr));//6)接收数据struct sockaddr_in otherAddr;int len = sizeof(struct sockaddr_in);while(1){char buf[1024]={0};recvfrom(socketfd,buf,sizeof(buf),0, (struct sockaddr *)&otherAddr,&len);printf("来自 %s:%u  recv:%s\n",inet_ntoa(otherAddr.sin_addr),ntohs(otherAddr.sin_port),buf);}//关闭 close(socketfd);return 0;
}

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

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

相关文章

日历热力图,月度数据可视化图表(日活跃图、格子图)vue组件

日历热力图&#xff0c;月度数据可视化图表&#xff0c;vue组件 先看效果&#x1f447; 在线体验https://www.guetzjb.cn/calanderViewGraph/ 日历图简单划分为近一年时间&#xff0c;开始时间是 上一年的今天&#xff0c;例如2024/01/01 —— 2025/01/01&#xff0c;跨度刚…

使用nginx搭建通用的图片代理服务器,支持http/https/重定向式图片地址

从http切换至https 许多不同ip的图片地址需要统一进行代理 部分图片地址是重定向地址 nginx配置 主站地址&#xff1a;https://192.168.123.100/ 主站nginx配置 server {listen 443 ssl;server_name localhost;#ssl证书ssl_certificate ../ssl/ca.crt; #私钥文件ssl_ce…

WPS数据分析000001

目录 一、表格的新建、保存、协作和分享 新建 保存 协作 二、认识WPS表格界面 三、认识WPS表格选项卡 开始选项卡 插入选项卡 页面布局选项卡 公式选项卡 数据选项卡 审阅选项卡 视图选项卡 会员专享选项卡 一、表格的新建、保存、协作和分享 新建 ctrlN------…

使用 HTML 开发 Portal 页全解析

前言 在当今数字化时代&#xff0c;网站作为企业和个人展示信息、提供服务的重要窗口&#xff0c;其重要性不言而喻。而 Portal 页&#xff0c;作为网站的核心页面之一&#xff0c;承担着引导用户、整合信息等关键任务。那么&#xff0c;如何使用 HTML 开发一个功能齐全、界面…

Spring Boot 项目启动报错 “找不到或无法加载主类” 解决笔记

一、问题描述 在使用 IntelliJ IDEA 开发基于 Spring Boot 框架的 Java 程序时&#xff0c;原本项目能够正常启动。但在后续编写代码并重建项目后&#xff0c;再次尝试运行却出现了 “错误&#xff1a;找不到或无法加载主类 com.example.springboot.SpringbootApplication” 的…

上位机工作感想-2024年工作总结和来年计划

随着工作年限的增增长&#xff0c;发现自己越来越不喜欢在博客里面写一些掺杂自己感想的东西了&#xff0c;或许是逐渐被工作逼得“成熟”了吧。2024年&#xff0c;学到了很多东西&#xff0c;做了很多项目&#xff0c;也帮别人解决了很多问题&#xff0c;唯独没有涨工资。来这…

ChatGPT被曝存在爬虫漏洞,OpenAI未公开承认

OpenAI的ChatGPT爬虫似乎能够对任意网站发起分布式拒绝服务&#xff08;DDoS&#xff09;攻击&#xff0c;而OpenAI尚未承认这一漏洞。 本月&#xff0c;德国安全研究员Benjamin Flesch通过微软的GitHub分享了一篇文章&#xff0c;解释了如何通过向ChatGPT API发送单个HTTP请求…

《keras 3 内卷神经网络》

keras 3 内卷神经网络 作者&#xff1a;Aritra Roy Gosthipaty 创建日期&#xff1a;2021/07/25 最后修改时间&#xff1a;2021/07/25 描述&#xff1a;深入研究特定于位置和通道无关的“内卷”内核。 &#xff08;i&#xff09; 此示例使用 Keras 3 在 Colab 中查看 GitHub …

GIFT ICA 下载记录

1.帮助文档 Group ICA/IVA Of fMRI Toolbox&#xff1b;【GIFT介绍】 Group ICA of fMRI Toolbox (GIFT) Walk Through&#xff1b;【流程介绍】 GIFT v1.3c Functions Srinivas Rachakonda, Eric Egolf and Vince Calhoun【流程解释】 2.下载记录 从官网下载程序包&#xff0…

LLMs(大型语言模型)的多智能体:Auto-GPT

LLMs(大型语言模型)的多智能体:Auto-GPT 是指在一个系统中集成多个具有不同能力、角色和任务的智能体,这些智能体能够相互协作、沟通和交互,以共同完成复杂的任务或解决复杂的问题。每个智能体都可以被视为一个独立的实体,具有自己的策略、目标和知识库,通过相互之间的…

【C++】C++11

目录 1. 整体学习思维导图 2. {}列表初始化 2.1 单个对象情况 2.2 多对象情况 3. 右值引用和移动语义 3.1 左值和右值 3.2 左值引用和右值引用 3.3 引用延迟生命周期 3.4 左值和右值的参数匹配 4. 左值引用和右值引用 4.1 左值引用 4.2 右值引用 5. 移动构造和移动…

无人机飞手考证难度增加,实操、地面站教学技术详解

随着无人机技术的快速发展和广泛应用&#xff0c;无人机飞手考证的难度确实在不断增加。这主要体现在对飞手的实操技能和地面站操作技术的要求上。以下是对无人机飞手考证中实操和地面站教学技术的详细解析&#xff1a; 一、实操教学技术详解 1. 无人机基础知识学习&#xff1…

解决npm install安装出现packages are looking for funding run `npm fund` for details问题

当我们运行npm install时&#xff0c;可能会收到类似以下的提示信息&#xff1a;“x packages are looking for funding.” 这并不是错误提示&#xff0c;也不会影响项目的正常运行。其实实在提醒有一些软件包正在寻求资金支持。 根据提示输入npm fund可以查看详细的信息&#…

程序员不可能不知道的常见锁策略

前面我们学习过线程不安全问题&#xff0c;我们通过给代码加锁来解决线程不安全问题&#xff0c;在生活中我们也知道有很多种类型的锁&#xff0c;同时在代码的世界当中&#xff0c;也对应着很多类型的锁&#xff0c;今天我们对锁一探究竟&#xff01; 1. 常见的锁策略 注意: …

当设置dialog中有el-table时,并设置el-table区域的滚动,看到el-table中多了一条横线

问题&#xff1a;当设置dialog中有el-table时&#xff0c;并设置el-table区域的滚动&#xff0c;看到el-table中多了一条横线&#xff1b; 原因&#xff1a;el-table有一个before的伪元素作为表格的下边框下&#xff0c;初始的时候已设置&#xff0c;在滚动的时候并没有重新设置…

模型部署工具01:Docker || 用Docker打包模型 Build Once Run Anywhere

Docker 是一个开源的容器化平台&#xff0c;可以让开发者和运维人员轻松构建、发布和运行应用程序。Docker 的核心概念是通过容器技术隔离应用及其依赖项&#xff0c;使得软件在不同的环境中运行时具有一致性。无论是开发环境、测试环境&#xff0c;还是生产环境&#xff0c;Do…

2025 最新flutter面试总结

目录 1.Dart是值传递还是引用传递&#xff1f; 2.Flutter 是单引擎还是双引擎 3. StatelessWidget 和 StatefulWidget 在 Flutter 中有什么区别&#xff1f; 4.简述Dart语音特性 5. Navigator 是什么&#xff1f;在 Flutter 中 Routes 是什么&#xff1f; 6、Dart 是不是…

Flask简介与安装以及实现一个糕点店的简单流程

目录 1. Flask简介 1.1 Flask的核心特点 1.2 Flask的基本结构 1.3 Flask的常见用法 1.3.1 创建Flask应用 1.3.2 路由和视图函数 1.3.3 动态URL参数 1.3.4 使用模板 1.4 Flask的优点 1.5 总结 2. Flask 环境创建 2.1 创建虚拟环境 2.2 激活虚拟环境 1.3 安装Flask…

记一次常规的网络安全渗透测试

视频教程在我主页简介和专栏里 目录&#xff1a; 前言 互联网突破 第一层内网 第二层内网 总结 前言 上个月根据领导安排&#xff0c;需要到本市一家电视台进行网络安全评估测试。通过对内外网进行渗透测试&#xff0c;网络和安全设备的使用和部署情况&#xff0c;以及网络…

Dockerfile另一种使用普通用户启动的方式

基础镜像的Dockerfile # 使用 Debian 11.9 的最小化版本作为基础镜像 FROM debian:11.11# 维护者信息 LABEL maintainer"caibingsen" # 复制自定义的 sources.list 文件&#xff08;如果有的话&#xff09; COPY sources.list /etc/apt/sources.list # 创建…