[C++ 网络协议] 多播与广播
目录
1. 多播
1.1 多播的使用情形
1.2 多播的原理
1.3 如何实现多播
1.4 多播的代码实现
2. 广播
2.1 广播与多播的区别
2.2 广播的分类
2.3 实现广播
1. 多播
1.1 多播的使用情形
考虑一种情形,你要向10000名用户发送数据,此时如果用TCP提供服务,则需要维护10000个套接字连接,如果用UDP提供服务,则也需要进行10000次数据传输。像这样,在这总情况下,就可以使用多播技术来解决问题。所以一般多播常用于多媒体数据的实时传输。
1.2 多播的原理
多播是基于UDP协议传输的。但又与UDP有一些不同,不同之处在于,UDP数据传输是以单一目标进行的,而多播则会将数据同时传递到加入(注册)多播组的大量主机。
其中,多播组是一种D类IP地址(224.0.0.0~239.255.255.255),加入多播组,可以理解为在D类IP地址中,我希望接收发往目标239.255.255.255的多播数据。
其原理如图:
多播数据包的格式与UDP数据包相同,但多播数据包在传输过程中时,路由器会复制该多播数据包并传递到多个主机。由此,主机只需要发送一次数据包,多个主机就能接受到,而无需一个数据包发多次。不像UDP或TCP,n个主机要接受数据包,就得传输n次。
1.3 如何实现多播
实现多播需要:
1.传递数据包的主机需要设置TTL(Time to Live,生存时间),TTL是决定数据包传送距离的主要因素,TTL用整数表示,每经过一个路由器就减1,直到TTL变为0时,数据包就无法再传输,只能销毁。因此TTL的值设置过大会影响网络流量,但过小就无法传递到目标。
2.接收数据包的主机需要加入多播组。
上述两个条件的设置,用套接字可选项来完成。
条件 | 协议层 | 可选项 |
设置TTL | IPPROTO_IP | IP_MULTICAST_TTL |
加入多播组 | IPPROTO_IP | IP_ADD_MEMBERSHIP |
1.4 多播的代码实现
设置TTL:
int time_to_live=64;
setsockopt(senderfd,IPPROTO_IP,IP_MULTICAST_TTL,(void*)&time_to_live,sizeof(time_to_live);
加入多播组:
ip_mreq join_adr;
join_adr.imr_multiaddr=inet_addr("要加入的多播组IP地址");
join_adr.imr_interface=htonl("加入该组的套接字所属主机的IP地址");setsockopt(recvfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,(void*)&join_adr,sizeof(join_adr));
struct ip_mreq
{struct in_addr imr_multiaddr; //要加入的多播组IP地址struct in_addr imr_interface; //加入该组套接字所属主机IP
}
其中,imr_interface可以用INADDR_ANY。
Sender:
#include<iostream>
#include<cstring>
#include<sys/socket.h>
#include<unistd.h>
#include<arpa/inet.h>int main()
{int senderfd=socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP);if(senderfd==-1){std::cout<<"socket fail!"<<std::endl;}int ttl=64;int res=setsockopt(senderfd,IPPROTO_IP,IP_MULTICAST_TTL,(void*)&ttl,sizeof(ttl));if(res==-1){std::cout<<"setsockopt fail!"<<std::endl;}std::string strIp;std::cout<<"请输入要发往的多播IP地址:";std::cin>>strIp;sockaddr_in senderAddr;senderAddr.sin_family=AF_INET;senderAddr.sin_addr.s_addr=inet_addr(strIp.c_str());senderAddr.sin_port=htons(9130);std::cout<<"请输入你要发送的内容:";char buff[1024];std::cin>>buff;int sendLen;sendto(senderfd,buff,sizeof(buff),0,(sockaddr*)&senderAddr,sizeof(senderAddr));close(senderfd);return 0;
}
Recv:
#include<iostream>
#include<cstring>
#include<sys/socket.h>
#include<unistd.h>
#include<arpa/inet.h>int main()
{int recvSocket = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);if (recvSocket == -1){std::cout << "socket fail!" << std::endl;}sockaddr_in recvAddr;recvAddr.sin_family = AF_INET;recvAddr.sin_addr.s_addr = htonl(INADDR_ANY);recvAddr.sin_port = htons(9130);if (-1 == bind(recvSocket, (sockaddr*)&recvAddr, sizeof(recvAddr))){std::cout << "bind fail!" << std::endl;}std::string strIp;std::cout << "请输入要加入的多播IP地址:";std::cin >> strIp;ip_mreq join_adr;join_adr.imr_multiaddr.s_addr = inet_addr(strIp.c_str());join_adr.imr_interface.s_addr = htonl(INADDR_ANY);int res=setsockopt(recvSocket, IPPROTO_IP, IP_ADD_MEMBERSHIP, (void*)&join_adr, sizeof(join_adr));if (res ==-1){std::cout << "setsockopt fail!" << std::endl;}char buff[1024];recvfrom(recvSocket, buff, sizeof(buff), 0, NULL, 0); //因为此套接字是已连接UDP套接字,所以无需再进行绑定std::cout <<"接收到的多播信息:" << buff << std::endl;close(recvSocket);return 0;
}
运行结果:
Sender:
Recv:
注意:
1.发送方和接收方的端口号要一致。
2.在这里接收方要先于发送方运行,因为多播属于广播的范畴,如果接收方延后,则会接收不到信息。
3.Windows里设置TTL,需要加上头文件#include<ws2tcpip.h>,因为IP_MULTICAST_TTL声明在这个头文件里。
2. 广播
2.1 广播与多播的区别
广播与多播的唯一区别是,广播只能向同一网络中的主机传输数据,而多播是可以跨越不同网络,只要加入多播组就能接收到数据的。
2.2 广播的分类
广播分为:直接广播、本地广播。
两者之间的差别主要是在于IP地址。
直接广播的IP地址除了网络地址外,其余主机地址全部设置为1,。例如,希望向网络地址为192.12.32中的所有主机传输数据,则可以向192.12.32.255传输。换言之,直接广播就是可以向特定区域内所有主机传输数据。
本地广播的IP地址限定为255.255.255.255。例如,位于192.32.24网络中的主机向255.255.255.255传递数据时,数据将传递到这个网路中的所有主机上。换言之,本地广播就是只能向本地网络区域内所有主机传输数据。
2.3 实现广播
广播的实现需要:
协议层 | 套接字可选项 | 值 |
SOL_SOCKET | SO_BROADCAST | 0【关闭】/1【开启】 |
int bcast=1;
setsockopt(send_sock,SOL_SOCKET,SO_BROADCAST,(void*)&bcast,sizeof(bcast));
广播的代码实现和多播没有什么区别,只需要把上述代码里套接字可选项改为SO_BROADCAST即可,然后在运行时,输入指定的IP地址(直接广播输入:xxx.xxx.xxx.255,本地广播输入:255.255.255.255)即可。
相关文章:
[C++ 网络协议] 多播与广播
目录 1. 多播 1.1 多播的使用情形 1.2 多播的原理 1.3 如何实现多播 1.4 多播的代码实现 2. 广播 2.1 广播与多播的区别 2.2 广播的分类 2.3 实现广播 1. 多播 1.1 多播的使用情形 考虑一种情形,你要向10000名用户发送数据,此时如果用TCP提供服…...
IOS17正式版今日发布
北京时间9月19日凌晨,苹果公司正式向全球用户推送了期待已久的iOS 17正式版。此次更新为iPhone带来了多项激动人心的功能,包括对“电话”、“信息”、FaceTime通话的重大更新,“待机显示”以及音乐、小组件、Safari浏览器的升级等。 据了解&…...
2560. 打家劫舍 IV
沿街有一排连续的房屋。每间房屋内都藏有一定的现金。现在有一位小偷计划从这些房屋中窃取现金。 由于相邻的房屋装有相互连通的防盗系统,所以小偷 不会窃取相邻的房屋 。 小偷的 窃取能力 定义为他在窃取过程中能从单间房屋中窃取的 最大金额 。 给你一个整数数…...
java web中部署log4j.xml
标题:Java Web中部署log4j.xml 目录: 1. 介绍 2. 配置log4j.xml文件 3. 配置web.xml文件 4. 配置Spring框架 5. 配置Spring Bean 6. 总结 ## 1. 介绍 在Java Web开发中,日志记录是非常重要的一部分。log4j是一个常用的Java日志记录框架&am…...
【张兔兔送书第一期:考研必备书单】
考研书单必备 《数据结构与算法分析》《计算机网络:自顶向下方法》《现代操作系统》《深入理解计算机系统》《概率论基础教程(原书第10版》《线性代数(原书第10版)》《线性代数及其应用》赠书活动 八九月的朋友圈刮起了一股晒通知…...
基于Spring Boot+ Vue的健身房管理系统与实现
小熊学Java全能学面试指南:https://javaxiaobear.cn 摘要 随着健身行业的快速发展,健身房管理系统成为了提高管理效率和用户体验的重要工具。本论文旨在设计与实现一种基于前后端分离的健身房管理系统,通过前后端分离的架构模式,…...
ThreadLocal线程局部变量
1.原理 ThreadLocal是用来保存当前线程数据的,每一个线程的内部都有一个ThreadLocalMap,当前这个map中存储了以当前ThreadLocal作键,具体的数据作值的一个个Entry对象。 为什么非得以ThreadLocal对象作键呢?因为一个线程可能使用了…...
C++ Primer (第五版)第一章习题部分答案
在我自学C过程中,我选择了CPrimer这本书,并对部分代码习题进行了求解以及运行结果。接下来几个月我将为大家定时按章节更新习题答案与运行结果: 目录 1.9编写程序,使用while循环将50到100的整数相加 1.10 除了运算符将运算对象的值增加1之外,还有一个…...
Python与GUI集成:零基础也能开发国际象棋游戏
引言: 国际象棋,作为世界上最受欢迎的棋类游戏之一,拥有丰富的策略和深度。但是,你知道自己可以使用Python来创建一个简单的国际象棋游戏并为其添加图形用户界面(GUI)吗?在本教程中,…...
SaaS软件能保证数据安全吗?
SaaS软件能保证数据安全吗? 本文将要尝试从各个方面尽可能客观的去阐述这个问题,而不是简单自嗨式的说简道云平台如何保障数据安全。 建议先收藏起来慢慢品! 01 SaaS安全到底是什么?——定义解读 本文所用SaaS平台>>>…...
方案:基于AI烟火识别与视频技术的秸秆焚烧智能化监控预警方案
一、方案背景 为严控秸秆露天焚烧,改善环境空气质量,各省相继发布秸秆禁烧工作内容。以安徽省为例,大气污染防治联席会议下发了该省2020年秸秆禁烧工作部署通知。2020年起,气象局将对全省秸秆焚烧火点实施卫星全年全时段监测&…...
phantomjs插件---实现通过链接生成网页截图
Phantomjs | PhantomJS 配置要求 windows下,安装完成phantomJS 设置phantomjs环境变量【也可直接使用phantomjs目录下的执行文件】 直接通过访问php文件执行/通过cmd命令行执行【phantomjs phantom_script.js】 linux下,安装完成phantomJS 设置phantomjs环境变量 直…...
SpringBoot分页实现查询数据
1.原生查询 1.1创建分页查询实体类 package com.itheima.pojo;import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;import java.util.List;//分页查询结果封装类 Data NoArgsConstructor AllArgsConstructor public class PageBean {pr…...
Jetson Xavier NX 与飞控(Pixhawk 4 Mini)实现串口通信
一、飞控端配置 首先对 Pixhawk 4 Mini 烧录固件参考 Kakute H7 刷写 px4 固件_想要个小姑娘的博客-CSDN博客 烧录完成后打开 QGroundControl,进入参数设置并搜索 MAV,如下所示 然后修改 MAV_1_CONFIG,修改为自己想要连接机载电脑…...
为什么2022年秋招嵌入式开发岗位薪资大涨?
今天看到一个网友讨论的问题,其实这个问题也很简答。从嵌入式本身优势来说,首先是因为该行业人才人才需求大,据权威统计机构统计在所有软件开发类人才的需求中,对嵌入式工程师的需求达到全部需求量的60%~80%,并且每年以…...
在HTML里,attribute和property有什么区别?
在HTML中,attribute 和 property 之间的区别是一个常见但容易混淆的概念。它们都与HTML元素有关,但它们在功能、用途和行为上有所不同。以下是它们之间的主要区别: 定义和来源: Attribute: 它们是在HTML标记中定义的,通常用于提供…...
机器学习入门与实践:从原理到代码
💂 个人网站:【工具大全】【游戏大全】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 在本文中,我…...
SpringCloud在idea中一键启动项目
1、如下图文件中加上: <component name"RunDashboard"><option name"configurationTypes"><set><option value"SpringBootApplicationConfigurationType" /></set></option></component>…...
VB过程的递归调用,辗转相除法求最大公约数
VB过程的递归调用,辗转相除法求最大公约数 过程的递归调用,辗转相除法求最大公约数 Private Function gys(ByVal m%, ByVal n%) As IntegerDim r%r m Mod n m大或者n大都无所谓,这个不影响计算,由于辗转相除法的算法,…...
OpenCV(三十九):积分图像
1.积分图像介绍 积分图像中的每个像素表示了原始图像中对应位置及其左上方矩形区域内像素值的总和。如图,p0表示原始图像蓝色区域内像素值的总和。 倾斜求和(Skewed Sum)是积分图像的一种扩展形式,用于计算图像区域内的像素和&…...
【Electron 拦截请求实现自定义网络处理】
文章目录 Electron 拦截请求实现自定义网络处理1. 获取默认会话2. 拦截请求3. 完整示例代码总结 Electron 拦截请求实现自定义网络处理 在 Electron 中,我们可以使用 session 模块来拦截和处理网络请求。通过拦截请求,我们可以对请求进行修改、添加请求…...
Pytest系列-内置标签skip和skipif 跳过测试用例的详细使用(5)
简介 skip和skipif,见名知意就是跳过测试,主要用于不想执行的代码,标记后,标记的代码不执行。希望满足某些条件才执行某些测试用例,否则pytest会跳过运行该测试用例实际常见场景:根据平台不同执行测试、跳…...
华为云云耀云服务器L实例评测|docker 常用操作命令
文章目录 写在前面云耀云服务器L实例与ECS的购买和配置区别 1、管理命令2、帮助命令3、镜像命令4、容器命令4.1 查看容器4.2 创建容器 实例 写在前面 前面讲到了docker环境的安装,这是我们可以直接打开远程连接华为云云耀云服务器L实例,直接连接公网…...
RJ45网络信号浪涌保护器解决方案
RJ45网络信号浪涌保护器是一种用于保护网络设备免受雷击或其他高压电流干扰的装置,它可以有效地吸收和释放信号线路上的过电压,从而避免设备损坏或数据丢失。 RJ45信号浪涌保护器的应用领域和施工方案如下: 地凯科技RJ45网络信号浪涌保护器…...
SoC性能指标ARM内核运算能力
自动驾驶芯片常用的性能评价指标:TOPS,DMIPS,GFLOPS分别说的是啥? TOPS Tera Operation Per Second,表示每秒钟可以进行的操作数量,用于衡量自动驾驶的算力。 众所周知,汽车上最常用的传感器是摄像头,而与之对应的计…...
注册小鲸鱼88888专用网站
点击注册充值即可 高效不限速,不限设备 注意这里的地址并没有错,只是你需要想办法正确能进入就行,懂的大佬一定知道用一定的方法访问的。...
GitHub平台 Bookget操作
以bookget为例,熟悉github平台。 https://github.com/deweizhu/bookget 选择该界面中的“Wiki”,右侧边栏中是文章的结构大纲。 下载bookget软件。 依照说明,安装bookget环境。...
Ag-grid实现列拖拽,将列顺序存储到本地(localStorage),加载页面时根据本地保存的顺序修改列表头顺序,避免刷新页面后列顺序恢复原样
Ag-grid实现列拖拽,将列顺序存储到本地(localStorage),加载页面时根据本地保存的顺序修改列表头顺序,避免刷新页面后列顺序恢复原样 今天在使用 ag-grid 的时候,遇到一个需求,ag-grid 列表头的信息拖拽后,…...
常用的linux命令简要说明以及命令全名理解
以下是一些常用的Linux命令及其全名: ls(List):列出目录中的文件和子目录。cd(Change Directory):切换当前工作目录。pwd(Print Working Directory):显示当前…...
《Python趣味工具》——自制emoji3
今日目标 在上次,我们绘制了静态的emoji图。并且总结了turtle中的常用函数。 本次我们将尝试制作一个动态的emoji,让你的表情包动起来! 文章目录 一、动画原理:二、制作动画:1. 修改eyes_black()函数:2. 绘…...
wordpress 模版不能更新/爱站网影院
请问各位兄弟,在Linux中怎么看网卡是全双工工作还是半双工工作?mii-tool Linux:~ # mii-tooleth0: no linketh1: no autonegotiation, 100baseTx-HD, link okLinux:~ # Linux:~ # mii-tool -Fmii-tool: option requires an argument -- Fusage: mii-too…...
政府大型网站建设/百度客服转人工
Lex自动地表示把输入串词法结构的正规式及相应的动作转换成一个宿主语言的程序,即词法分析程序,它有一个固定的名字yyler,在这里yyler是一个C语言的程序。Yylex将识别出输入串中的词形,并且在识别出某词形…...
app制作网站有哪些 请列举/网络推广合作资源平台
光电响应通常是激光二极管、探测器性能的一种非常普遍和重要的特性。光电响应测试主要指对发光器件和光探测器进行测试,单独的探测器像 PIN和 APD二极管测试系统比较简单,通常光电IV测试主要指针对激光二极管或光电探测器件的测试。LD 测试阶段主要分为 …...
seo竞争对手网站分析/惠州百度推广优化排名
文章目录前言一、微信支付小程序确认支付结果和退款功能实现1.确认支付结果2.退款功能实现前言 微信小程序在支付成功后会给注册的接口发消息来通知订单支付成功的状态,下面是微信和接口通信的数据格式: 微信通知频率为: 15s/15s/30s/3m/10m/20m/30m/…...
iis7架设网站教程/游戏推广是什么工作
eclipse又一次编译时候就会报错Errors occurred during the build. Errors running builder JavaScript Validator on。如图: 解决的方法是:项目右键--properties---builders---javascript validator 如图: 转载于:https://www.cnblogs.com/m…...
怎么在濮阳网站做宣传/百度小说风云榜2022
第四章 计算机网络练习题1、Internet网采用的通信协议是( B )协议。A、x.25 B、TCP/IP C、SMIP D、IPX/SPX2、国际标准化组织的英文缩写是( B )。(A) OSI (B) ISO (C) ANSI (D) IEEE3、WWW采用( A )技术组织和管理浏览或信息检索的系统。A、超文本和超媒体 B、快速查询 C、动画…...