UDP多播

article/2025/9/9 21:48:06

一、多播概念

1.1、多播

        多播又称为:组播。 一个人发数据,只有加入到多播组的人接收数据

1.2、多播的特点

    1、多播地址标示一组接口
    2、多播可以用于广域网使用
    3、在IPv4中,多播是可选的

1.3、多播地址 

IPv4的D类地址是多播地址
十进制:224.0.0.1~239.255.255.254
十六进制:E0.00.00.01~EF.FF.FF.FE

 组播地址是分类编址的IPv4地址中的D类地址,又叫多播地址,他的前四位必须是1110,多播组的地址是D类IP,规定是224.0.0.0——239.255.255.255。

1.4、多播ip地址用处

224.0.0.0~224.0.0.255为预留的组播地址(永久组地址),地址224.0.0.0保留不做分配,其它地址供路由协议使用


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为本地管理组播地址,仅在特定的本地范围内有效

1.5、多播地址向以太网MAC地址的映射

1.5.1、计算多播mac地址(mac地址占48位)

解题方法:组播地址MAC以01-00-5e开头(规定的),占25bit。由于MAC地址是48bit,而IP地址有32bit,因此需要从ip地址获取后23位。如何获取,最安全的又准确的方法:就是把IP地址,换成二进制数。第2个8位中的第1位规定为0,去掉前8位,再把剩下的二进制换成16进制,最后添加在01-00-5e后面即可

举例说明

例如 1、求224.128.129.130的组播MAC过程如下:

第一步:我们可以永远都知道多播mac地址前25位,都是01-00-5e(规定的)

第二步:把ip地址化为二进制 

        224.128.129.130的二进制形式

    1110 0000 1000 0000 1000 0001  1000 0010  把第2个8位中的第1位规定为0,即红色的1改为0

得:  1110 0000 0000 0000 1000 0001  1000 0010  把前8位去掉,即黑色部分去掉

得:  0000 0000 1000 0001  1000 0010  

第三步:把得出的二进制转化成16进制(0000 0000 1000 0001  1000 0010  

得:  00-81-82

第三步:合并

该ip的组播mac地址:01-00-5e-00-81-82

二、多播工作过程

多播不需要设置setsockopt(套接字选项)

比起广播,多播具有可控性,只有加入多播组的接收者才可以接收数据,否则接收不到

 2.1、分析发送端设置流程

 第一步:创建套接字——socket函数

第二步:设置为UDP协议和端口号(此端口为 对方的端口号 )

第三步:设置IPV4,由于使用的是多播,需要把ip地址 设为多播地址.

              多播地址范围:224.0.0.0——239.255.255.255。

第四步:设置传输为以太网,mac地址根据ip地址  (转看1.5示例)

2.2、分析如何传输与接收

第一步:把打包好数据包,发送到多播组里。

第二步:接收者想要接收到信息,必须要先加入多播组里

三、多播代码流程

发送者:
第一步:创建套接字 socket()
第二步:向多播地址发送数据 sendto()


接收者:
第一步:创建套接字 socket()
第二步:设置为加入多播组 setsockopt()第三步:将套接字与多播信息结构体绑定 bind()
第五步:接收数据

四、多播地址结构

在IPv4因特网域(AF_INET)中,多播地址结构体用如下结构体ip_mreq表示

 五、多播套接口选项(接收者需要使用此函数加入多播组)

头文件

            #include <sys/socket.h>
函数:

   int setsockopt(int socket, int level, int option_name,const void *option_value, socklen_t option_len);
功能:

           设置一个套接字的选项(属性)
参数:
            socket:文件描述符
            level:协议层次
                         IPPROTO_IP IP层次
           option_name:选项的名称
                                   IP_ADD_MEMBERSHIP 加入多播组
           option_value:设置的选项的值

结构体
          struct ip_mreq
 {
        struct in_addr imr_multiaddr; //组播ip地址
        struct in_addr imr_interface; //主机地址
        INADDR_ANY 任意主机地址(自动获取你的主机地址)
        };
           option_len:option_value的长度
 返回值:
               成功:0
               失败:‐1

多播设置

    mreq.imr_multiaddr.s_addr=inet_addr(argv[1]);
    mreq.imr_interface.s_addr=INADDR_ANY;//        INADDR_ANY获取自己的ip地址
    socklen_t optlen =sizeof(mreq);

    if(setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,optlen) < 0)
    {
        perror("fail to setsockopt");
        exit(1);
        }

5.1、发送者(代码)

#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h>         
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>int main(int argc  ,char *argv[])
{if(argc<3){printf("error lose ip port\n");exit(1);}int sockfd;if((sockfd=socket(AF_INET,SOCK_DGRAM,0))==-1){perror("fail to sockfd");exit(1);}struct sockaddr_in mysockaddr;mysockaddr.sin_family = AF_INET;mysockaddr.sin_port =htons(atoi(argv[2]));mysockaddr.sin_addr.s_addr=inet_addr(argv[1]);socklen_t addrlen= sizeof(mysockaddr);char buf[128];while(1){	fgets(buf,sizeof(buf),stdin);if(sendto(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&mysockaddr,addrlen)==-1){perror("fail to sendto");exit(1);}}close(sockfd);return 0;}

 5.2、接收者(代码)

#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h>         
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include<string.h>int main(int argc  ,char *argv[])
{if(argc<3){printf("input fail lose ip port");exit(1);}int sockfd;if((sockfd=socket(AF_INET,SOCK_DGRAM,0))==-1){perror("fail to sockfd");exit(1);}struct ip_mreq mreq;mreq.imr_multiaddr.s_addr=inet_addr(argv[1]);mreq.imr_interface.s_addr=INADDR_ANY;socklen_t optlen =sizeof(mreq);if(setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,optlen) < 0){perror("fail to setsockopt");exit(1);}struct sockaddr_in mysockaddr;mysockaddr.sin_family = AF_INET;mysockaddr.sin_port =htons(atoi(argv[2]));mysockaddr.sin_addr.s_addr=inet_addr(argv[1]);socklen_t addrlen= sizeof(mysockaddr);if(bind(sockfd,(struct sockaddr *)&mysockaddr,addrlen)==-1){perror("fail to bind");exit(1);}char buf[128];struct sockaddr_in sendsockaddr;socklen_t sendaddrlen=sizeof(sendsockaddr);while(1){	if(recvfrom(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&sendsockaddr,&sendaddrlen)==-1){perror("fail to recvfrom");exit(1);}printf("[%s ‐ %d]: %s\n", inet_ntoa(sendsockaddr.sin_addr), ntohs(sendsockaddr.sin_port),buf);}close(sockfd);return 0;}

运行结果

 多播地址范围:224.0.0.0——239.255.255.255。

我设置了多播组地址为:224.0.0.2 端口号为8081

只要加入了224.0.0.2多播组地址并且端口号为8081的客户端,服务器绑定的多播组224.0.0.2都会接收到客户端发来的数据。


http://chatgpt.dhexx.cn/article/sk7agXto.shtml

相关文章

多播(组播)

什么是多播 单播用于两个主机之间的端对端通信&#xff0c;广播用于一个主机对整个局域网上所有主机上的数据通信。单播和广播是两个极端&#xff0c;要么对一个主机进行通信&#xff0c;要么对整个局域网上的主机进行通信。实际情况下&#xff0c;经常需要对一组特定的主机…

多播与广播

多播 多播(Multicast)方式的数据传输是基于UDP完成的。因此&#xff0c;与UDP服务器端/客户端的实现方式非常接近。区别在于&#xff0c;UDP数据传输以单一目标进行&#xff0c;而多播数据同时传递到加入(注册)特定组的大量主机。换言之&#xff0c;采用多播方式时&#xff0c…

多播(IP多播-网络层)与单播

多播&#xff08;IP多播-网络层&#xff09;与单播 多播&#xff08;IP多播-网络层&#xff09;简介多播组地址&#xff08;IP地址中的D类地址&#xff09;【多播组地址——D类地址】中一些不能随意使用的地址 IP多播的分类 在局域网上进行的硬件多播网际组管理协议IGMP和多播路…

多播的概念

一、多播概述 多播&#xff1a;数据的收发仅仅在同一组中进行 &#xff08;相当于我往一个群里发&#xff0c;只有加入这个群的人才能收到&#xff09; 多播的特点&#xff1a; ①多播地址标示一组接口。 ②多播可以用于广域网使用。 ③在IPv4&#xff0c;多播是可选的。 二…

win10——telnet 开启

1.win10默认没有开启 2.找到控制面板 3.找到Telnet客户端 4.测试 5.退出 ctrl ‘]’ 之后q

windows service2008 2R 开启telnet

1&#xff0c;什么是telnet 可以把telnet当作一种通信协议&#xff0c;对于入侵者而言telnet是一种远程登录的工具。 2&#xff0c;windows开启telnet&#xff08;默认情况下windows系统的telnet功能是关闭的&#xff09; 步骤&#xff1a; ①打开控制面板 输入winR 输入contro…

windows telnet开启

windows下telnet 服务开启 工作中经常要判断服务器某个端口是否连通&#xff0c;如需要看下测试服务器中tomcat的8080端口是否连通&#xff0c;需用到命令 &#xff1a; telnet 192.168.1.101 8080 ,如图&#xff1a; 解决方案 1、telnet在win7下默认是不开启的&#xff0c;所…

服务器系统开启telnet,Telnet怎么打开 Win7/Win8系统开启Telnet服务方法图解

Telnet是管理员常用的远程登录和管理工具&#xff0c;通过在本地电脑上运行Telnet客户端服务&#xff0c;就可以远程控制远端的Telnet服务器了。在Windows 2003/XP/Vista/Win7/Win8系统中都集成有Telnet服务。过默认情况下Telnet服务是被禁用的&#xff0c;需要使用的朋友&…

linux 打开telnet登录,linux开启telnet

Centos6启telnet 安装 [rootntp1 ~]# yum install telnet telnet-server xinetd 开启xinetd自启动和启动xinetd [rootntp1 ~]# chkconfig xinetd on [rootntp1 ~]# service xinetd restart 允许root用户登录 [rootntp1 ~]# vi /etc/pam.d/remote 修改/etc/pam.d/remote&#xf…

如何保存网页上的图片原图,大图

如何保存网页上的图片原图&#xff0c;大图 步骤1&#xff1a; 使用google浏览器&#xff0c;打开网页&#xff0c;按F12&#xff08;或者打开 ‘开发者工具’&#xff09;&#xff0c;点击source&#xff0c;并选择img过滤。可以看到下面的图片链接&#xff0c;如图&#xf…

网页保存成图片

Chrome中网页保存成图片 1、F12 2、Ctrl Shift P 3、输入full firefox网页保存成图片 1、看下附加组件中是否有网页截图&#xff0c;如有&#xff0c;则直接使用即可&#xff0c;无&#xff0c;打开(或下载)就行 2、截图 &#xff08;个人觉得firefox的截图比较灵活&#x…

图片的加载、显示和保存

目录 1.预备知识 2.代码实现 1.预备知识 imread() 加载图片imwrite() 保存图像 imread() 加载图片 有两个参数&#xff0c;第一个参数为字符串形式&#xff0c;也就是图片的路径 第二个参数是一个flag&#xff0c;指定了读取图像的方式&#xff0c; 默认的是加…

图片上传-->保存图片

显示图片的img标签 获取文件读取器 var imageReadernew FileReader(); 使用正则表达式给图片过滤 regexImageFilter /^(?:image/bmp|image/gif|image/jpg|image/jpeg|image/png)$/i; 文件读取器加载时间&#xff0c;在读取文件完成后触发 imageReader.οnlοadfunction(ev…

Python爬虫 自动爬取图片并保存

一、准备工作 用python来实现对图片网站的爬取并保存&#xff0c;以情绪图片为例&#xff0c;搜索可得到下图所示 f12打开源码 在此处可以看到这次我们要爬取的图片的基本信息是在img - scr中 二、代码实现 这次的爬取主要用了如下的第三方库 import re import time import …

保存网页图片的方法

最近ui妹子经常找我....... 当然不是的....只是想让我给他弄两张网页的图片....遂FE退化切图仔.... 话不多说&#xff0c;进入正文。有些朋友因为工作需要&#xff08;比如某鹿某祖等图片好想保存下来天天舔屏&#xff0c;还得是高清的....&#xff09;又不知道如何保存网页中…

图片管理之保存图片数据

保存图片数据 在保存数据之前我们需要先获取图片关联的sku的id 1、获取sku表id 接口分析 请求方式&#xff1a; GET /meiduo_admin/skus/simple/ # -------获取sku的id--------url(rskus/simple/$, images.ImageView.as_view({get: simple})), 请求参数&#xff1a; 通过请…

图片的上传与保存

先找到数据库的用户表点击设计添加 picture 字段与 nvarchar 数据类型 2.更新数据模型&#xff0c;先找到 S_User 表删除&#xff0c;然后再从数据库更新模型并保存 3.先在视图上写出图片上传与保存需要的页面 3.1 { title: ‘头像’, templet: customUserPicture },//头像…

yarn 下载安装

注意 尽量不要使用 npm 下载 yarn 因为可能下载的不是全局的&#xff0c;而且可能没有修改注册表 导致以后下载全局的东西的时候下载失败 如果已经安装了&#xff0c;且出现全局错误提示 可以直接使用 官网安装包 他会自动覆盖你之前的安装&#xff0c;并且擦写 注册表 下…

windows下安装yarn

目录 1.介绍 2.下载和安装 3.配置环境变量和镜像源 1.介绍 最近接触的公司前端项目用到了Yarn&#xff0c;先来了解一下Yarn&#xff0c;Yarn是Facebook最近发布的一款依赖包安装工具。Yarn是一个新的快速安全可信赖的可以替代NPM的依赖管理工具。 官网的说明是 Yarn is …

npm 安装yarn

Yarn是Facebook最近发布的一款依赖包安装工具。Yarn是一个新的快速安全可信赖的可以替代NPM的依赖管理工具 快速安装 //在NPM 中安装 npm install -g yarn MacOS 在Mac上安装比较方便&#xff0c;使用初始化脚本即可 1 curl -o- -L https://yarnpkg.com/install.sh | bash …