udp多播/组播那些事
多播与组播
多播(multicast)和组播(groupcast)是相同的概念,用于描述在网络中一对多的通信方式。在网络通信中,单播(unicast)是一对一的通信方式,广播(broadcast)是一对所有的通信方式,而多播(或组播)是一对多的通信方式。
多播/组播通信允许一个发送者将数据包同时传输给多个接收者,这些接收者形成一个接收组(receiving group)或多播组(multicast group)。发送者只需发送一次数据包,而不需要为每个接收者单独发送。
只存在于udp
UDP协议支持多播和广播,而TCP协议不直接支持广播和多播。
UDP协议是一种无连接的协议,它允许应用程序通过多播地址或广播地址发送数据包。多播地址是一个预定义的IP地址范围,用于标识多播组,而广播地址则是一个特殊的IP地址,用于向网络中的所有主机发送数据包。
在UDP中,你可以使用特定的套接字选项设置多播地址,并使用sendto()
函数发送数据包到多播组。接收端可以通过加入相同的多播组地址,使用recvfrom()
函数接收多播数据包。
相比之下,TCP协议是一种面向连接的协议,它提供可靠的、有序的数据传输。TCP协议不直接支持多播和广播功能,因为它是基于点对点通信模型的,只能通过建立一对一的连接进行数据传输。
多播接收端程序
以下是一个使用C语言编写的简单示例,用于接收和发送多播数据包:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>#define MULTICAST_GROUP "239.0.0.1" // 多播组地址
#define PORT 12345 // 多播组的端口号
#define MAX_BUFFER_SIZE 1024 // 接收缓冲区大小int main() {int sockfd;struct sockaddr_in multicastAddr;struct sockaddr_in clientAddr;char buffer[MAX_BUFFER_SIZE];// 创建UDP套接字sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (sockfd < 0) {perror("socket creation failed");exit(EXIT_FAILURE);}// 设置套接字选项,允许接收多播数据int enable = 1;if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &enable, sizeof(enable)) < 0) {perror("setsockopt SO_REUSEADDR failed");exit(EXIT_FAILURE);}// 绑定到本地地址和端口memset(&clientAddr, 0, sizeof(clientAddr));clientAddr.sin_family = AF_INET;clientAddr.sin_addr.s_addr = INADDR_ANY;clientAddr.sin_port = htons(PORT);if (bind(sockfd, (struct sockaddr *)&clientAddr, sizeof(clientAddr)) < 0) {perror("bind failed");exit(EXIT_FAILURE);}// 加入多播组struct ip_mreq multicastReq;multicastReq.imr_multiaddr.s_addr = inet_addr(MULTICAST_GROUP);multicastReq.imr_interface.s_addr = htonl(INADDR_ANY);if (setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&multicastReq, sizeof(multicastReq)) < 0) {perror("setsockopt IP_ADD_MEMBERSHIP failed");exit(EXIT_FAILURE);}printf("Waiting for multicast messages...\n");while (1) {// 接收多播数据包socklen_t addrLen = sizeof(multicastAddr);ssize_t recvLen = recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr *)&multicastAddr, &addrLen);if (recvLen < 0) {perror("recvfrom failed");exit(EXIT_FAILURE);}buffer[recvLen] = '\0';printf("Received multicast message: %s\n", buffer);}// 关闭套接字close(sockfd);return 0;
}
在该示例中,我们使用socket()
函数创建了一个UDP套接字,并使用setsockopt()
函数设置了SO_REUSEADDR
选项,以便允许套接字重新使用本地地址。然后,我们使用bind()
函数将套接字绑定到本地地址和端口。
接下来,我们使用IP_ADD_MEMBERSHIP
选项加入多播组,指定了多播组地址和本地网络接口。这样,套接字就可以接收到发送到指定多播组的数据包。
最后,我们使用一个循环来持续接收多播数据包。使用recvfrom()
函数从套接字接收数据包,并打印接收到的消息。
请注意,接收端和发送端应该使用相同的多播组地址和端口号以进行通信。
多播发送断程序
以下是一个使用C语言编写的简单多播发送示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>#define MULTICAST_GROUP "239.0.0.1" // 多播组地址
#define PORT 12345 // 多播组的端口号int main() {int sockfd;struct sockaddr_in multicastAddr;char *message = "Hello, Multicast!";// 创建UDP套接字sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (sockfd < 0) {perror("socket creation failed");exit(EXIT_FAILURE);}// 设置多播组地址和端口号memset(&multicastAddr, 0, sizeof(multicastAddr));multicastAddr.sin_family = AF_INET;multicastAddr.sin_addr.s_addr = inet_addr(MULTICAST_GROUP);multicastAddr.sin_port = htons(PORT);// 发送多播数据包if (sendto(sockfd, message, strlen(message), 0, (struct sockaddr *)&multicastAddr, sizeof(multicastAddr)) < 0) {perror("sendto failed");exit(EXIT_FAILURE);}printf("Multicast message sent.\n");// 关闭套接字close(sockfd);return 0;
}
在这个示例中,我们创建了一个UDP套接字,并设置了多播组的地址和端口号。然后,使用sendto()
函数将消息发送到多播组的地址。最后,关闭套接字。
注意事项
对于发送多播数据包的示例,不需要显式地绑定本地端口。
在发送端,我们只需创建一个UDP套接字并将数据包发送到多播组的地址。操作系统会自动选择一个本地端口进行发送。
接收端需要绑定本地端口是因为它需要告诉操作系统将接收到的多播数据包发送到哪个端口。
当接收端加入一个多播组时,它需要指定一个本地端口来接收多播数据包。通过将套接字绑定到一个特定的本地端口,操作系统会将接收到的多播数据包传递给该端口上运行的应用程序。
绑定本地端口的步骤通常在接收端的代码中进行,以便接收来自多播组的数据包。在之前提供的多播接收示例中,我们在接收端的代码中使用bind()
函数将套接字绑定到本地地址和端口。
简而言之,接收端绑定本地端口是为了告诉操作系统将接收到的多播数据包传递给相应的应用程序,而发送端无需显式地绑定本地端口,操作系统会自动选择一个可用的本地端口进行发送。
相关文章:
udp多播/组播那些事
多播与组播 多播(multicast)和组播(groupcast)是相同的概念,用于描述在网络中一对多的通信方式。在网络通信中,单播(unicast)是一对一的通信方式,广播(broad…...
C++ Qt开发:SqlRelationalTable关联表组件
Qt 是一个跨平台C图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍SqlRelationalTable关联表组件的常用方法及灵…...
【LeetCode】修炼之路-0001-Two Sum(两数之和)【python】【简单】
前言 计算机科学作为一门实践性极强的学科,代码能力的培养尤为重要。当前网络上有非常多优秀的前辈分享了LeetCode的最佳算法题解,这对于我们这些初学者来说提供了莫大的帮助,但对于我这种缺乏编程直觉的学习者而言,这往往难以消化吸收。(为什么别人就能想出这么优雅…...
秋招复习篇之代码规范
目录 前言 1、变量命名 2、代码空格 1)操作符左右一定有空格, 2)分隔符(, 和;)前一位没有空格,后一位保持空格,例如: 3)大括号和函数保持同一行,并有一个空格…...
Docker:登录私有仓库\退出私有仓库
一、登录仓库 docker login : 登录到一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub 语法: docker login [OPTIONS] [SERVER] docker login -u 用户名 -p 密码 仓库名称 # 登入私有仓库 [rootlocalhost ~]# docker login --…...
与擎创科技共建一体化“数智”运维体系,实现数字化转型
小窗滴滴小编获取最新版公司简介 前言: 哈喽大家好,最近分享的互联网IT热讯大家都挺喜欢,小编看着数据着实开心,感谢大家支持,小编会继续给大家推送。 新岁即将启封,我们一年一期的运维干货年末大讲也要…...
开放网络+私有云=?星融元的私有云承载网络解决方案实例
在全世界范围内的云服务市场上,开放网络一直是一个备受关注的话题。相比于传统供应商的网络设备,开放网络具备软硬件解耦、云原生、可选组件丰富等优势,对云服务商和超大型企业有足够的吸引力。 SONiC作为开源的网络操作系统,使得…...
【Linux学习笔记】Linux下nginx环境搭建
1、下载nginx 安装rpm命令: rpm ivh nginx-release.rpm。(直接使用linux命令下载wget http://nginx.org/packages/rhel/6/noarch/RPMS/nginx-release-rhel-6-0.el6.ngx.noarch.rpm 2、设置nginx开机启动 chkconfig nginx on 3、开启nginx服务 方法一:service nginx…...
Python打包
将 Python 脚本打包成可执行的 .exe 文件,通常可以使用 PyInstaller 这个库来实现。PyInstaller 是一个流行的工具,它可以将 Python 程序和所有相关的依赖打包成一个独立的可执行文件,适用于 Windows、Linux 和 macOS 系统。安装 PyInstaller 首先,需要安装 PyInstaller。…...
2023启示录丨自动驾驶这一年
图片|《老人与海》插图 过去的20年,都没有2023年如此动荡。 大模型犹如一颗原子弹投入科技圈,卷起万里尘沙,传统模式瞬间被夷为平地,在耀眼的白光和巨大的轰鸣声之下,大公司、创业者、投资人甚至是每一位观…...
node实现对git仓库的管理
一、项目背景 一份代码,发布多个小程序。想让技术支持部通过脚本自己获取代码,并通过脚本自动提交到客户的小程序后台。他们自行发布。 现已注册第三方平台,开发人员通过“开发小程序”上传模板。开发人员把代码上传到模板,支持…...
『JavaScript』全面解析JavaScript中的防抖与节流技术及其应用场景
📣读完这篇文章里你能收获到 理解防抖(Debouncing)和节流(Throttling)的概念:了解这两种性能优化技术如何帮助我们更有效地处理频繁触发的事件掌握防抖与节流的实现方法:学习如何在JavaScript中…...
智能优化算法应用:基于袋獾算法3D无线传感器网络(WSN)覆盖优化 - 附代码
智能优化算法应用:基于袋獾算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于袋獾算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.袋獾算法4.实验参数设定5.算法结果6.参考文献7.MA…...
Ubuntu20.04-查看GPU的使用情况及输出详解
1. 查看GPU的使用情况 1.1 nvidia-smi # 直接在终端得到显卡的使用情况 # 不会自动刷新 nvidia-smi# 重定向到文件中 nvidia-smi > nvidia_smi_output.txt# 如果输出的内容部分是以省略号表示的,可以-q nvidia-smi -q 1.2 nvidia-smi -l # 会自动刷新&#x…...
Python中的数据序列
Python中的数据序列 一、作业回顾 1、求幸运数字6 幸运数字6(只要是6的倍数):输入任意数字,如数字8,生成nums列表,元素值为1~8,从中选取幸运数字移动到新列表lucky,打印nums与lucky。 # 第一步:定义二个空列表 nums = [] lucky = [] # 第二步:提示用户输入数字 n…...
带您了解目前AI在测试领域能够解决的那些问题
AI在测试领域主要应用场景 话不多说,直接给结论: 接口测试脚本的自动生成和校验(依赖研发ai工具)测试用例的自动生成UI自动化测试脚本的自动生成和校验测试文档的自动生成快速了解初涉的业务领域 关于ai对研发和测试的整体影响…...
Jmeter学习总结(2)——时间参数化time
13位的时间戳精确都毫秒级别。 常用的时间定义格式如下: log.info("${__time(,ts)}"); log.info("${ts}"); log.info(vars.get("ts")); //136232232232log.info("${__time(yyyy-MM-dd,)}"); //当前年月日2023-12-2…...
Leetcode 746 使用最小花费爬楼梯
题意理解: 给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。 一旦你支付此费用,即可选择向上爬一个或者两个台阶。 你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯 目标:使用最小的花…...
2023/12/21作业
思维导图 代码 .text .global _start _start: 灯1 gpio时钟使能 [4]->1 0x5000A28 LDR R0,0x50000A28 指定寄存器地址 LDR R1,[R0]将寄存器取出放到R1 ORR R1,R1,#(0x1<<4)将第四位设置为1 STR R1,[R0]读取R0寄存器到R1 PE…...
Python 数据类型 (2)
1 集合类型:一维数组的集合 List列表是一个有序且可变的集合。允许重复成员。 turple元组是一个有序且不可更改的集合。允许重复成员。 Set集合是一个无序且无索引的集合。没有重复的成员。 dict字典是一个有序*且可变的集合。没有重复的成员。 !&#x…...
【教程】自动检测和安装Python脚本依赖的第三方库
转载请注明出处:小锋学长生活大爆炸[xfxuezhang.cn] 背景说明 对于新python环境,要运行某个脚本,可能需要安装很多库,一般可以通过提供的requirements.txt来自动安装。但如果没有这个txt,那就得手动一个一个安装&#…...
0开始配置Cartographer建图和导航定位
0开始配置Cartographer 日期:12-19 硬件:激光雷达IMU 小车的tf变换: 建图配置 lua文件配置:my_robot.lua include "map_builder.lua" include "trajectory_builder.lua"options {map_builder MAP_BUILDE…...
Python中使用SQLite数据库的方法2-2
3.3.2 创建表单及字段 通过“3.2 创建Cursor类的对象”中创建的Cursor类的对象cur创建表单及字段,代码如图5所示。 图5 创建表单及字段 从图5中可以看出,通过Cursor类的对象cur调用了Cursor类的execute()方法来执行SQL语句。该方法的参数即为要指定的S…...
零代码也能玩出花:Mugeda在H5设计中的魔法力量
文章目录 一、Mugeda零代码可视化H5设计工具简介二、Mugeda零代码可视化H5设计实战案例1. 注册并登录Mugeda账号2. 选择模板3. 编辑页面内容4. 添加动画效果5. 预览和发布 三、Mugeda零代码可视化H5设计的优势《Mugeda零代码可视化H5设计实战》内容简介作者简介目录前言/序言 随…...
分布式、CAP 和 BASE 理论
在计算机科学领域,分布式系统是一门极具挑战性的研究方向,也是互联网应用中必不可少的优化实践,而 CAP 理论和 BASE 理论则是分布式系统中的两个关键的概念。 什么是分布式系统 首先,让我们来谈谈分布式系统。你可以将分布式系统…...
django之drf框架(两个视图基类、5个扩展视图类、9个视图子类)
两个视图基类 APIView和GenericAPIView drf提供的最顶层的父类就是APIView,以后所有的类都继承自他 GenericAPIView继承自APIView,他里面封装了一些工能 基于APIViewModelSerializerResposne写5个接口 子路由:app01>>>urls.py …...
23种设计模式学习
设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合…...
php 8.4 xdebug扩展编译安装方法
最新版php8.4 xdebug扩展只能通过编译方式安装, pecl是安装不了的, 编译方法如下 下载最新版xdebug git clone https://github.com/xdebug/xdebug.git 却换入xdebug目录执行编译安装xdebug cd xdebug phpize./configure --enable-xdebugmakemake install3. 配置启用xdebug 这…...
66biolinks v42.0.0 已注册 – 生物短链接、URL 缩短器、QR 码和 Web 工具 (SAAS) 源码
66biolinks v42.0.0:全能生物短链接与网络工具平台 一、开篇介绍 66biolinks v42.0.0是一款集生物链接、URL缩短器、二维码和网络工具于一体的综合性软件解决方案。作为社交生物链接平台的佼佼者,66biolinks提供了全方位的功能,旨在满足用户…...
《Vue2.X 进阶知识点》- 防 ElementUI Divider 分割线
前言 使用 el-divider 背景为白色是没问题的。 但当背景换成其它颜色,问题就出现了!! 仔细看原来是两层,默认背景色是白色。 想着把背景色改为透明应该能用,结果发现背面是一条实线,难怪要用白色遮挡…不符…...
如何做网站界面/百度客服在线客服入口
数据库中的价格字段是 float 类型的,在 Laravel 中取出会出现这样的情况 数据库:71.9 -> 程序打印:72.0数据库:75.2 -> 程序打印:75.3在另外一个测试环境是没有问题的,请问是 PDO 要设置什么…...
购物网站个人中心模板/seo去哪里培训
在windows上写完项目后,怎么把项目部署到linux系统上呢? 1_导出SQL语句 2_启动linux,利用CTR连接 3_修改2个配置文件中的参数 c3p0.xm jedisUtils 4_导出项目,以war包形式 5_启动tomcat 6_利用sqlyog连接linux下的mysql,恢复数据 7_启动…...
网站logo在哪里/seo超级外链
GridFS的原理是将大文件分割为多个比较大的块,将每个块作为独立的文档进行存储。(1)GridFS中的块会被存贮到专用的集合中,默认为fs.chunks;(2)除了将文件的每一个块单独存储外,还需要将每个文件…...
抖音电商/seo查询是什么
# 开始绘图 fig, ax1 plt.subplots() fig.set_size_inches(12, 6) plt.set_cmap(RdBu) # multiple line plot x np.arange(featureValuedf.shape[1]) # x坐标的范围 lw 4 # 控制线条的粗细 a, ax1.plot(x, featureValuedf.loc[Back].to_numpy(),linewidthlw, labelBack, ma…...
做企业形象网站/网站建设方案书 模板
这个方案唯一值得注意的一点就是设备的选型,在图中我们能看到需要20个远程接入点,那么所选设备最少也要支持20个点的扩展,即在CISCO设备上必须要有20个以上的广域网接口。这里我们选用3845,经过模块化的扩展,可以最多支…...
网站建设优化石家庄/如何推广外贸型网站
docker 使用一段时间之后,可能堆积很多用不着的,或者编译错误的镜像,一个一个删除就很麻烦,需要一个批量删除的方法,如下: docker rmi $(docker images | grep "provider" | awk {print $3})上面这条命令,可以删除所有名字中带 “provider” 关键字的镜像, grep 后面…...