多播与广播

article/2025/9/10 3:56:03

多播

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

多播特点

  • 多播服务器端针对特定多播组,只发送1次数据。
  • 即使只发送1次数据,但该组内的所有客户端都会接收数据。
  • 多播组数可在IP地址范围内任意增加。
  • 加入特定组即可接收发往该多播组的数据。

多播组是D类IP地址(224.0.0.0~239.255.255.255 ),"加入多播组”可以理解为通过程序完成如下声明:
"在D类IP地址中,我希望接收发往目标239.234.218.234的多播数据。"

路由(Routing)和TTL(Time to Live,生存时间)

为了传递多播数据包,必需设置TTL。TTL是Time to Live的简写,是决定“数据包传递距离”的主要因素。TTL用整数表示,并且每经过1个路由器就减1。TTL变为0时,该数据包无法再被传递,只能销毁。因此,TTL的值设置过大将影响网络流量。当然,设置过小也会无法传递到目标,需要引起注意。

在这里插入图片描述
程序中的TTL设置是通过套接字可选项完成的。与设置TTL相关的协议层为IPPROTO_IP,选项名为IP_MULTICAST_TTL。因此,可以用如下代码把TTL设置为64。

int send_sock;
int time_live=64;
. . . .
send_sock=socket(PF_INET,SOCK_DGRAM,日);
setsockopt(send_sock,IPPROTO_IP,IP_MULTICAST_TTL,(void*) &time_live,sizeof(time_live)) ;
. . . .

加入组的方法

加入多播组也通过设置套接字选项完成。加入多播组相关的协议层为IPPROTO_IP,选项名为IP_ADD_MEMBERSHIP。可通过如下代码加入多播组。

int recv_sock;
struct ip_mreq join_adr;. . . .
recv_sock=socket(PF_INET,SOCK_DGRAM,0);. . . .
join_adr.imr_multiaddr.s_addr="多播组地址信息";
join_adr.imr_interface.s_addr="加入多播组的主机地址信息";
setsockopt(recv_sock,IPPROTO_IP,IP_ADD_MEMBERSHIP,(void*) & join_adrsizeof(join_adr)) ;

· . . .
上述代码只给出了与setsockopt函数相关的部分,详细内容将在稍后示例中给出。此处只讲解ip_mreq结构体,该结构体定义如下。

struct ip_mreq{struct in_addr imr_multiaddr;struct in_addr imr_interface;
}
  • imr_multiaddr:写人加入的组IP地址。
  • imr_interface:加入该组的套接字所属主机的IP地址,也可使用INADDR_ANY。

多播代码示例

Sender比Receiver简单,因为Receiver需要经过加入组的过程,而Sender只需创建UDP套接字,并向多播地址发送数据。

  • news_sender.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>#define TTL 64
#define BUF_SIZE 30
void error_handling(char *message);int main(int argc,char * argv[])
{int send_sock;struct sockaddr_in mul_adr;int time_live = TTL;FILE *fp;char buf[BUF_SIZE];if(argc != 3){printf("Usage:%s <GroupIP> <PORT>\n",argv[0]);exit(1);}send_sock = socket(PF_INET,SOCK_DGRAM,0);memset(&mul_adr,0,sizeof(mul_adr));mul_adr.sin_family = AF_INET;mul_adr.sin_addr.s_addr = inet_addr(argv[1]);	//Multicast IPmul_adr.sin_port = htons(atoi(argv[2]));	//Multicast Portsetsockopt(send_sock,IPPROTO_IP,IP_MULTICAST_TTL,(void*)&time_live,sizeof(time_live));if((fp = fopen("news.txt","r")) == NULL)error_handling("fopen() error");while(!feof(fp))	//Broadcasting{fgets(buf,BUF_SIZE,fp);sendto(send_sock,buf,strlen(buf),0,(struct sockaddr*)&mul_adr,sizeof(mul_adr));sleep(2);}fclose(fp);close(send_sock);return 0;
}void error_handling(char * message)
{fputs(message,stderr);fputc('\n',stderr);exit(1);
}
  • new_receiver.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>#define BUF_SIZE 30
void error_handling(char *message);int main(int argc,char *argv[])
{int recv_sock;int str_len;char buf[BUF_SIZE];struct sockaddr_in adr;struct ip_mreq join_adr;if(argc != 3){printf("Usage:%s <GroupIP> <PORT>\n",argv[0]);exit(1);}recv_sock = socket(PF_INET,SOCK_DGRAM,0);memset(&adr,0,sizeof(adr));adr.sin_family = AF_INET;adr.sin_addr.s_addr = htonl(INADDR_ANY);adr.sin_port = htons(atoi(argv[2]));if(bind(recv_sock,(struct sockaddr*)&adr,sizeof(adr)) == -1)error_handling("bind() error");join_adr.imr_multiaddr.s_addr = inet_addr(argv[1]);join_adr.imr_interface.s_addr = htonl(INADDR_ANY);setsockopt(recv_sock,IPPROTO_IP,IP_ADD_MEMBERSHIP,(void*)&join_adr,sizeof(join_adr));while(1){str_len = recvfrom(recv_sock,buf,BUF_SIZE-1,0,NULL,0);if(str_len < 0)break;buf[str_len] = 0;fputs(buf,stdout);}close(recv_sock);return 0;
}void error_handling(char * message)
{fputs(message,stderr);fputc('\n',stderr);exit(1);
}

输出:
目前还没正确运行,后期补充!!!

广播

广播(Broadcast)在"一次性向多个主机发送数据"这一点上与多播类似,但传输数据的范围有区别。多播即使在跨越不同网络的情况下,只要加入多播组就能接收数据。相反,广播只能向同一网络中的主机传输数据。

广播特点

广播是向同一网络中的所有主机传输数据的方法。与多播相同,广播也是基于UDP完成的。根据传输数据时使用的IP地址的形式,广播分为如下2种。

  • 直接广播(Directed Broadcast )
  • 本地广播( Local Broadcast )
    二者在代码实现上的差别主要在于IP地址。直接广播的IP地址中除了网络地址外,其余主机地址全部设置为1,其余主机地址全部设置为1。例如,希望向网络地址192.12.34.255中的所有主机传输数据时,可以向192.12.34.255传输。换言之,可以采用直接广播的方式向特定区域内所有主机传输数据。
    反之,本地广播中使用的IP地址限定为255.255.255.255。例如,192.32.24网络中的主机向255.255.255.255传输数据时,数据将传递到192.32.24网络中的所有主机。
    那么,应当如何实现Sender和Receiver呢?实际上,如果不仔细观察广播示例中通信时使用的IP地址,则很难与UDP示例进区分。也就是说,数据通信中使用的IP地址是与UDP示例的唯一区别。默认生成的套接字会阻止广播,因此,只需通过如下代码更改默认设置。
int send_sock;
int bcast = 1;//对变量进行初始化以将SO_BROADCAST选项信息改为1。
. . . .
send_sock = socket(PF_INET,SOCK_DGRAM,0);. . . .
setsockopt(send_sock, soL_SOCKET,SO_BROADCAST,(void*) & bcast, sizeof(bcast));
. . . .

调用setsockopt函数,将SO_BROADCAST选项设置为bcast变量中的值1。这意味着可以进行数据广播。当然,上述套接字选项只需在Sender中更改,Receiver的实现不需要该过程。

代码示例略

Windows多播示例略


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

相关文章

多播(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 …

yarn常用安装命令

纯属哔哔赖赖瞎扯一下&#xff0c;以前一直用npm install、npm run &#xff0c;突然来yarn&#xff0c;懵逼了&#xff0c;这是啥&#xff1f;感觉应该是和npm一样的东西&#xff0c;只是这里用yarn&#xff0c;难道它是npm更高级的替代品&#xff1f;为什么要替代npm&#xf…

yarn的安装与使用,以及一些常用命令

官网&#xff1a;首页 | Yarn - JavaScript 软件包管理器 | Yarn 中文文档 - Yarn 中文网 1 - 简介 Yarn 对你的代码来说是一个软件包管理器&#xff0c; 你可以通过它使用全世界开发者的代码&#xff0c;或者分享自己的代码给全世界的开发者。Yarn 做这些事情快捷、安全、可靠…