4.34、组播(多播)

news/2025/4/1 6:11:42/

4.34、多播

  • 1.组播(多播)的介绍
    • ①组播地址
    • ②如何设置组播(组播的使用)
  • 2.代码编写
    • ①服务端
    • ②客户端

1.组播(多播)的介绍

单播地址标识单个 IP 接口,广播地址标识某个子网的所有 IP 接口,多播地址标识一组 IP 接口。单播和广播是寻址方案的两个极端(要么单个要么全部),多播则意在两者之间提供一种折中方案。多播数据报只应该由对它感兴趣的接口接收,也就是说由运行相应多播会话应用系统的主机上的接口接收。另外,广播一般局限于局域网内使用,而多播则既可以用于局域网,也可以跨广域网使用。

  • a: 组播既可以用于局域网,也可以用于广域网
  • b: 客户端需要加入多播组,才能接收到多播的数据

在这里插入图片描述

①组播地址

IP 多播通信必须依赖于 IP 多播地址,在 IPv4 中它的范围从 224.0.0.0239.255.255.255 ,并被划分为局部链接多播地址、预留多播地址和管理权限多播地址三类:

IP地址说明
224.0.0.0~224.0.0.255局部链接多播地址:是为路由协议和其它用途保留的地址,路由器并不转发属于此范围的IP包
224.0.1.0~224.0.1.255预留多播地址:公用组播地址,可用于Internet;使用前需要申请
224.0.2.0~238.255.255.255预留多播地址:用户可用组播地址(临时组地址),全网范围内有效
239.0.0.0~239.255.255.255本地管理组播地址,可供组织内部使用,类似于私有 IP 地址,不能用于 Internet,可限制多播范围

②如何设置组播(组播的使用)

int setsockopt(int sockfd, int level, int optname,const void *optval, socklen_t optlen);// 服务器设置多播的信息,外出接口- level : IPPROTO_IP- optname : IP_MULTICAST_IF- optval : struct in_addr- // 客户端加入到多播组:- level : IPPROTO_IP- optname : IP_ADD_MEMBERSHIP- optval : struct ip_mreqstruct ip_mreq
{/* IP multicast address of group. */struct in_addr imr_multiaddr; // 组播的IP地址/* Local IP address of interface. */struct in_addr imr_interface; // 本地的IP地址
};typedef uint32_t in_addr_t;
struct in_addr
{in_addr_t s_addr;
};

2.代码编写

①服务端

#include <iostream>
#include <unistd.h>
#include <cstring>
#include <arpa/inet.h>using namespace std;int main() {// 创建通信的fdint fd = socket(PF_INET, SOCK_DGRAM, 0);//设置多播的外出接口in_addr multi_cast;inet_pton(AF_INET, "239.0.0.10", &multi_cast.s_addr);// 设置多播的外出接口setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF, &multi_cast, sizeof(multi_cast));// 初始化客户端的ip地址和端口sockaddr_in addr;addr.sin_family = AF_INET;addr.sin_port = htons(9999);inet_pton(AF_INET, "239.0.0.10", &addr.sin_addr.s_addr);int num = 0;char sendBuf[128];while (1) {// 初始化数据sprintf(sendBuf, "hello client, data: %d\n", num ++ );// 输出数据查看一下cout << sendBuf << endl;// 发送数据sendto(fd, sendBuf, strlen(sendBuf) + 1, 0, (sockaddr *)&addr, sizeof(addr));sleep(1);}return 0;
}

②客户端

#include <iostream>
#include <unistd.h>
#include <cstring>
#include <arpa/inet.h>using namespace std;int main() {// 创建文件描述符int fd = socket(PF_INET, SOCK_DGRAM, 0);// 绑定本地ip和端口sockaddr_in client_addr;client_addr.sin_family = AF_INET;client_addr.sin_port = htons(9999);client_addr.sin_addr.s_addr = INADDR_ANY;bind(fd, (sockaddr *)&client_addr, sizeof(client_addr));// 加入到多播的组中ip_mreq op;inet_pton(AF_INET, "239.0.0.10", &op.imr_multiaddr.s_addr);op.imr_interface.s_addr = INADDR_ANY;setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &op, sizeof(op));char recvBuf[128];while (1) {recvfrom(fd, recvBuf, sizeof(recvBuf), 0, NULL, NULL);cout << "I am client, data: " << recvBuf << endl;}return 0;
}

http://www.ppmy.cn/news/46601.html

相关文章

Java每日一练(20230416)

目录 1. 三数之和 &#x1f31f;&#x1f31f; 2. 基本计算器 &#x1f31f;&#x1f31f;&#x1f31f; 3. 通配符匹配 &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java…

ubuntu输入法问题汇总

Xfce4桌面环境输入法 Ubuntu20.04、ubuntu21.04中安装xfce4桌面环境&#xff0c;自带中文输入法&#xff1b; 原生xubuntu20.04中文输入法问题解决办法&#xff1a; 更新语言支持失败的话&#xff0c;终端键入&#xff1a;sudo apt-get install cmake qt5-default qtcreator…

在Github中77k星的王炸AutoGPT,会独立思考,直接释放双手

文章目录 1 前言1.1 什么是AutoGPT1.2 为什么是AutoGPT 2 AutoGPT部分实例2.1 类似一个Workflow2.2 市场调研2.3 自己写播客2.4 接入客服 3 安装和使用AutoGPT3.1 安装3.2 基础用法3.3 配置OpenAI的API3.4 配置谷歌API3.5 配置Pinecone API 4.讨论 1 前言 迄今为止&#xff0c…

Java基本类型和包装类型int和Integer

Java基本类型和包装类型int和Integer 基本类型和包装类型的区别使用中的问题 基本类型和包装类型的区别 Java中的数据类型可以分为两种&#xff1a;基本类型&#xff08;Primitive Type&#xff09;和包装类型&#xff08;Wrapper Class&#xff09;。这两者之间也有几个区别&…

【UE4】关卡流送的demo

关卡流送功能可以将地图文件加载到内存中&#xff0c;或者从内存中卸载&#xff0c;并在游戏过程中切换地图的可视性。 这样一来&#xff0c;场景便能拆分为较小的地图块&#xff0c;并且只有相关部分才会占用资源并被渲染。 正确设置后&#xff0c;开发者便能创建大型、无缝衔…

面试题:Ajax、Fetch、Axios三者的区别

Ajax 它的全称是&#xff1a;Asynchronous JavaScript And XML&#xff0c;翻译过来就是“异步的 Javascript 和 XML”。 Ajax 是一个技术统称&#xff0c;是一个概念模型&#xff0c;它囊括了很多技术&#xff0c;并不特指某一技术&#xff0c; Ajax 是一种思想&#xff0c;X…

java的泛型

1. 泛型是什么 ​ Java泛型是J2 SE1.5中引入的一个新特性&#xff0c;其本质是参数化类型&#xff0c;也就是说所操作的数据类型被指定为一个参数&#xff08;type parameter&#xff09;, 这种参数类型可以用在类、接口和方法的创建中&#xff0c;分别称为泛型类、泛型接口、…

Dell Inspiron 5570电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。&#xff08;下载请直接百度黑果魏叔&#xff09; 硬件型号驱动情况 主板Dell Inspiron 5570 处理器Intel(R) Core(TM) i7-8550U CPU 1.80GHz已驱动 内存8 GB 2400 MHz DDR4已驱动 硬盘samsung ssd 850 evo 250 go已驱…