广播、组播 socket编程

news2025/1/12 12:11:05

         目录

1、单播 / 广播 / 组播 的概念

(1) 单播

(2) 广播

(3) 多播(组播)

2、广播 socket编程(只能是UDP通信)

3、多播 socket编程(只能是UDP通信)


1、单播 / 广播 / 组播 的概念

(1) 单播

之前在进行UDP和TCP编程的时候,客户端把数据发送到指定IP地址,此时接收方只有一个,这种数据包发送方式称为“单播”。

(2) 广播

如果是把数据发送某个局域网中的所有主机,这种数据包的发送方式称为“广播

  • 发送出去的数据会被 广播地址所在网段的所有主机接收
  • 每个局域网的最大主机地址代表该网段的广播地址
    • 以192.168.1.0 (255.255.255.0) 网段为例,192.168.1.255代表该网段的广播地址
  • 255.255.255.255 在所有网段中都代表广播地址。
    • 如果主机A向 255.255.255.255 发数据,那么当前局域网里的所有主机都会收到数据。

(3) 多播(组播)

如果是把数据发送给某个局域网中的一组IP地址,这种发送方式称为“多播”,这个组称为“多播组”,只有加入多播组的主机才能收到数据。

  • 广播是发给某一局域网中的所有主机。过多的广播会大量占用网络带宽,造成广播风暴,影响正常的通信。
  • 多播是一种折中的方式,既能发送给多个主机,又能避免象广播那样带来过多的负载

2、广播 socket编程(只能是UDP通信)

广播socket编程的侧重点在发送方(客户端),而且只有使用UDP协议才能广播。接收方的代码可以沿用单播的代码。发送方的数据发送步骤如下:

  • 创建用户数据报套接字
  • 套接字默认不允许广播数据包(因为可能引发广播风暴),需要使用 setsockopt设置属性
  • 目标地址(接收方地址) 指定为广播地址
  • 指定目标端口
  • 发送数据包
#define DST_PORT 9090

/* 1. 创建socket fd */
if ((fd = socket (AF_INET, SOCK_DGRAM, 0)) < 0) {	//UDP编程
    perror ("socket");
    exit (1);
}

/* 2. 允许广播设置 */
int b_br = 1;
setsockopt(fd, SOL_SOCKET, SO_BROADCAST, &b_br, sizeof(int));

/*3. 指定目标IP和端口号填充 */
struct sockaddr_in sin;
memset(&sin, 0, sizeof(sin))
sin.sin_family = AF_INET;
sin.sin_port = htons (SERV_PORT);	                  //网络字节序的端口号
sin.sin_addr.s_addr = inet_addr("192.168.11.255");    // 广播地址


/*4. 发送数据 */
char buf[128] = {'1','2','3','4','5','6','\0'};
sendto (fd, buf, strlen(buf), 0, (struct sockaddr *)&sin, sizeof(sin));

3、多播 socket编程(只能是UDP通信)

多播socket编程的侧重点在接收方(服务端),接收方要创建一个多播组(类似于QQ群),然后把当前套接字加入到多播组中;而发送方发送数据的目标地址不是服务端的IP地址,而是多播组的IP地址。

  • 创建数据报套接字
  • 绑定IP地址和端口号
  • 创建多播组(类似于创建QQ群)
  • 将当前套接字加入到多播组(类似于加群)
  • 接收数据
#define SERV_PORT 9090
#define MULTICAST_IP "192.168.11.170"
#define BUFSIZE 128

int fd = -1;

/* 1. 创建socket fd */
if ((fd = socket (AF_INET, SOCK_DGRAM, 0)) < 0) {	//udp程序
    perror ("socket");
    exit (1);
}

/* 2. 绑定IP地址和端口号 */
struct sockaddr_in sin;
memset(&sin, 0, sizeof(sin))
sin.sin_family = AF_INET;
sin.sin_port = htons(SERV_PORT);	         // 网络字节序的端口号
sin.sin_addr.s_addr = htonl(INADDR_ANY);    // 服务端可以绑定任意IP
if (bind (fd, (struct sockaddr *) &sin, sizeof (sin)) < 0) {
    perror ("bind");
    exit (1);
}

/* 3. 创建多播组,初始化多播组结构体 */
struct ip_mreq mreq;
memset(&mreq, 0, sizeof(mreq))
mreq.imr_multiaddr.s_addr = inet_addr(MULTICAST_IP);
mreq.imr_interface.s_addr = htonl(INADDR_ANY);

/* 4. 把当前套接字加入到多播组 */
setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));

/* 5. 接收数据 */
char buf[BUFSIZE ];
struct sockaddr_in cin;
socklen_t addrlen = sizeof(cin);
recvfrom (fd, buf, BUFSIZE - 1, 0, (struct sockaddr *)&cin, &addrlen);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/76180.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

m基于FPGA的MSK调制解调系统verilog开发,并带FPGA误码检测模块和matlab仿真程序

目录 1.算法描述 2.仿真效果预览 3.Verilog核心程序 4.完整FPGA 1.算法描述 整个模型的基本框图为 软件无线电是现代通信技术的重要研究领域和发展方向,目前发展迅速.快速发展的软件无线电技术与落后的硬件计算资源之间的矛盾越来越突出.为了缓解这个矛盾,一方面可以加快集…

职场日常:一文剖析性能测试流程,时间为啥那么长?

如果你做过性能测试&#xff0c;你就会知道&#xff0c;性能测试的时间要比功能测试时间长很多&#xff0c;但是&#xff0c;你没有做过&#xff0c;你可能就会问了&#xff0c;为什么性能测试时间要长那么多呢&#xff1f;今天就用一文&#xff0c;带大家了解性能测试工作流程…

自学python?一般人我还是劝你算了吧

前言 本人纯屌丝一枚&#xff0c;在学python之前对电脑的认知也就只限于上个网&#xff0c;玩个办公软件。这里不能跑题&#xff0c;我为啥说自学python&#xff0c;一般人我还是劝你算了吧。因为我就是那个一般人。 基础真的很简单&#xff0c;是个人稍微认点真都能懂&#…

Python一学就会系列:01 开发环境搭建 及 hello world

文章目录前言一、python是什么&#xff1f;官网简介二、开发环境安装1.下载2.安装3. 验证是否安装成功编写一个python新建一个后缀名为py的文件运行python文件总结前言 一、python是什么&#xff1f; 官网 https://www.python.org/ 简介 官网介绍&#xff1a; Python是一种编…

美团面试官总结的“Spring boot面试文档”,全是大厂高频面试题,太全了!

前言 Spring boot不单单在BAT这些一线大厂使用率极其的高&#xff0c;在中小企业中使用率也是非常高的&#xff0c;企业的需求增大&#xff0c;当然对待面试者的要求也会随之提高&#xff0c;竞争也会随之增大。 相信现在的你之所以可以看到我的这篇文章&#xff0c;那肯定是…

[附源码]计算机毕业设计的高校课程知识库Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Python数据分析项目案例

第一部分&#xff1a;数据类型处理 数据加载 字段含义&#xff1a; user_id:用户IDorder_dt:购买日期order_product:购买产品的数量order_amount:购买金额观察数据 查看数据的数据类型数据中是否存储在缺失值将order_dt转换成时间类型查看数据的统计描述在源数据中添加一列表示…

图像风格迁移基础入门及实践案例总结

目录 &#xff11;图像的不同风格 &#xff12;何为图像风格迁移 &#xff12;.&#xff11;基础概念及方法 &#xff12;.&#xff12;示例 &#xff13;图像风格迁移的典型研究成果 &#xff13;.1deep-photo-styletransfer &#xff13;.2CycleGAN &#xff13;.3U-…

【问题记录】Mac M1 Docker配置redis一主二从三哨兵(烧饼好吃)

文章目录Docker配置 redis一主二从三哨兵文件目录redis compose 文件在 redis 文件路径下执行 docker composesentinel 文件结构sentinel compose 配置文件sentinel config 配置文件切换到 sentinel执行 compose测试及问题记录解决方案Docker配置 redis 一主二从三哨兵 文件目…

8家最大的WooCommerce在线商店

想象一下&#xff0c;世界上三分之一的电子商务网站都由单一技术提供支持&#xff0c;而且令人惊讶的是它是免费的。我说的是最大的电子商务解决方案提供商之一&#xff0c;WooCommerce。在这里&#xff0c;我们列出了8 家最大的WooCommerce在线商店&#xff0c;以激发您建立自…

基于jsp+mysql+ssm供应链管理信息系统-计算机毕业设计

项目介绍 本文以销售供应链管理系统的开发为背景&#xff0c;对企业销售管理系统的分析&#xff0c;设计&#xff0c;开发和实施过程进行了详细的描述。本系统基于ssm框架访问作为后台数据库管理连接&#xff0c;通过jdbc与数据库建立连接&#xff0c;以jsp为前端开发工具提供…

数据库之MHA高可用集群部署及故障切换

目录 1 MHA概念 1.1 MHA 的组成 1.2 MHA 的特点 2 搭建MySQLMHA 2.2 修改三台MySQL服务器的主配置文件/etc/my.cnf&#xff0c;并创建命令软链接 2.3 配置MySQL一主两从 2.4 安装 MHA 软件 2.5 在所有服务器上配置无密码认证 2.6 在 manager 节点上配置 MHA 2.7 第一次配…

分类评价指标

不均衡数据 很多时候&#xff0c;不同类别的分类代价并不相等&#xff0c;这就是非均衡分类问题。如果在两个类别中&#xff0c;一个类别的出现次数比另一个多很多&#xff0c;那么错误类型将发挥重要作用。例如。我们一共有100个病人&#xff0c;其中99人是健康的&#xff08…

『.Net』在C#/.Net中将Json压缩成一行的几种方式

&#x1f4e3;读完这篇文章里你能收获到 在.Net Core中使用多种方式将Json压缩成一行主要介绍两种实现方案&#xff0c;Newtonsoft.Json和内置的System.Text.Json 文章目录一、Newtonsoft.Json二、System.Text.Json一、Newtonsoft.Json 将 Formatting 参数设为 Formatting.No…

世界杯杂谈之有趣的数据纪录

目录 &#xff08;一&#xff09;前言 &#xff08;二&#xff09;正文 1. 关于出场 &#xff08;1&#xff09;出场次数 &#xff08;2&#xff09;出场时间最长球员 &#xff08;3&#xff09;连续出场决赛场次最多 &#xff08;4&#xff09;世界杯出场时间最短的人 …

在Mac上优雅的使用ssh和sftp (像win上的xshell和xftp一样)

怎样在Mac上SSH和FTP?完美替代XShell是哪个软件?item2吗?Royal TSX! 没有比它更好_哔哩哔哩_bilibili 下载Royal TSX Royal TSX https://www.royalapps.com/ts/mac/features 安装插件 创建document 在document里面添加ssh和sftp 点击左下角加号,依次选这两个,因为一样,所…

使用Jenkins扩展钉钉消息通知

Jenkins借助钉钉插件&#xff0c;实现当构建失败时&#xff0c;自动触发钉钉预警。虽然插件允许自定义消息主体&#xff0c;支持使用 Jenkins环境变量&#xff0c;但是局限性依旧很大。当接收到钉钉通知后&#xff0c;若想进一步查看报错具体原因&#xff0c;仍完全依赖邮件通知…

LWIP——无操作系统移植

目录 移植说明 LwIP前期准备 以太网DMA描述符 LwIP移植流程 添加网卡驱动程序 添加LwIP源文件 移植头文件 网卡驱动编写 移植总结 移植说明 LwIP的移植可以分为两大类&#xff1a;第一类是只移植内核核心&#xff0c;此时用户应用程序编写只能基于RaW/CallBack API进行…

mybatisplus 集成druid连接池源码分析

mybatisplus 集成druid连接池源码分析&#xff1a;从spring的源码过渡到druid的相关jar包&#xff0c;里面是druid相关的类&#xff0c;下面我们开始分析&#xff1a; 1、取数据库连接的地方入口&#xff1a;public abstract class DataSourceUtils 为spring-jdbc包里面的过渡…

深度学习 Day21——利用RNN实现心脏病预测

深度学习 Day21——利用RNN实现心脏病预测 文章目录深度学习 Day21——利用RNN实现心脏病预测一、前言二、我的环境三、什么是RNN四、前期工作1、设置GPU2、导入数据3、检查数据五、数据预处理1、划分数据集2、数据标准化六、构建RNN模型七、编译模型八、训练模型九、模型评估十…