4.34、组播(多播)

这篇具有很好参考价值的文章主要介绍了4.34、组播(多播)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.组播(多播)的介绍

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

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

4.34、组播(多播)

①组播地址

IP 多播通信必须依赖于 IP 多播地址,在 IPv4 中它的范围从 224.0.0.0239.255.255.255 ,并被划分为局部链接多播地址、预留多播地址和管理权限多播地址三类:文章来源地址https://www.toymoban.com/news/detail-419888.html

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_mreq

struct 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() {

    // 创建通信的fd
    int 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;
}

到了这里,关于4.34、组播(多播)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Qt实现UDP单播和组播功能

    UDP是不可靠、无连接的,所以划分为发送方和接收方更好理解  UDP是无连接的,进行单播通信时,只需要绑定接收方端口就行,发送方直接通过接收方的ip和绑定的端口进行通信。发送方可以绑定端口也可以不用绑定端口,不绑定端口的话,系统会随机分配端口。 对于多网卡

    2024年04月12日
    浏览(23)
  • UDP 多播(组播)

     前言(了解分类的IP地址) 1.组播(多播) 单播地址标识单个IP接口,广播地址标识某个子网的所有IP接口,多播地址标识一组IP接口。单播和广播是寻址方案的两个极端(要么单个要么全部),多播则意在两者之间提供一种这种方案。 多播数据报只应该由它感兴趣的接口接

    2024年02月11日
    浏览(25)
  • udp多播/组播那些事

    多播(multicast)和组播(groupcast)是相同的概念,用于描述在网络中一对多的通信方式。在网络通信中,单播(unicast)是一对一的通信方式,广播(broadcast)是一对所有的通信方式,而多播(或组播)是一对多的通信方式。 多播/组播通信允许一个发送者将数据包同时传输给

    2024年04月15日
    浏览(35)
  • JavaCV音视频开发宝典:UDP局域网组播推流,多播推流,局域网多网段推流,使用UDP方式推送TS组播流,实现UDP一对多组播

    《JavaCV音视频开发宝典》专栏目录导航 《JavaCV音视频开发宝典》专栏介绍和目录 ​ 在之前文章中我们已经实现rtp点到点传输JavaCV音视频开发宝典:rtp点到点音视频传输(一对一音视频直播)和rtp广播JavaCV音视频开发宝典:rtp广播方式发送TS流音视频传输(一对多音视频会议

    2024年02月03日
    浏览(44)
  • 【Linux C | 网络编程】多播的概念、多播地址、UDP实现多播的C语言例子

    😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭 🤣本文内容🤣:🍭介绍多播的概念、多播地址、UDP实现广播的C语言例子 🍭 😎金句分享😎:🍭你不能选择最好的,但最好的会来选择你——泰戈尔🍭

    2024年03月11日
    浏览(39)
  • 组播IP地址到组播MAC地址的映射

    以太网的MAC地址由48位二进制数标识,而以太网组播MAC地址的前24位固定为 01-00-5e ,因此组播MAC地址主要靠后面24位标识。 在IP地址分类中,D类地址(范围:224.0.0.0 - 239.255.255.255)被用于组播,而IP地址是由32位二进制组成的,将其转换为二进制表示为: 组播IP地址到组播MAC地

    2024年02月06日
    浏览(25)
  • 组播地址与组播MAC的换算

    组播地址与其对应的组播MAC换算关系如下: 组播MAC=组播MAC标识+组播IP后23位对应的二进制位(32位的IP地址取后23位导致32组IP地址对应的多播IP相同) ( IANA把01:00:5E开头的以太网MAC块,作为组播地址对应的二层组播MAC地址 第25位规定取0, )         例如:组播地址: 224.205.155.110 其对

    2024年01月22日
    浏览(28)
  • 腾达路由组播地址的一些设置要点

        一、IPMulticast地址为D类地址 ,地址范围224.0.0.0-239.255.255.255,并将D类地址划分为本地链接组播地址、预留组播地址、管理权限组播地址,本地链接地址:224.0.0.0~224.0.0.255,用于局域网,路由器不转发属于此范围的IP包,预留组播地址:224.0.1.0~238.255.255.255,用于全球范围或网络

    2024年02月05日
    浏览(33)
  • 组播IGMP-原理介绍+报文分析+配置示例

    个人认为, 理解报文就理解了协议 。通过报文中的字段可以理解协议在交互过程中相关传递的信息,更加便于理解协议。 因此本文将在IGMPv2协议报文的基础上进行介绍,以详细介绍主机-路由器IGMP组播协议。IGMPv1和IGMPv3则只进行比对介绍。 关于IGMPv2相关内容, 可参考1997年

    2023年04月15日
    浏览(28)
  • 安卓唯一标识:IMEI,MEID,MAC地址,Android_id,UUID,OAID

    目录 IMEI: MEID: MAC地址: Android_id: UUID: OAID: 安卓设备的唯一标识,获取的目的在于数据统计,广告归因分析等用途。常用作唯一标识的有IMEI,MEID,MAC地址,Android_id,UUID,OAID等。 国际移动设备识别码 (International Mobile Equipment Identity,IMEI),即通常所说的手机序列号

    2024年02月16日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包