【TCP/IP】广播 - 定义、原理及编程实现

2023-11-10

        本文共计2974字,预计阅读时间4分钟

目录

广播

广播的原理及形式

广播的编程与实现

套接字选项设置

发送者

接收者

拓展资料


广播

        广播(Broadcast)是指封包在计算机网络中传输时,目的地址为网络中所有设备的一种传输方式。这里所说的“所有设备”也被限定在一个范围之中,这个范围被称为“广播域”。

        基于广播的特性,广播普遍应用于局域网中,而不用于广域网。

广播的原理及形式

        多播的数据传输协议与多播相同,通过UDP协议完成。同时,广播又分为两种形式,分别是:

  • 直接广播 (能够跨越不同网络的广播)
  • 本地广播 (只在本地网络中的广播)

        直接广播用于向特定区域内(已知目标主机网络地址)主机传输数据。使用上,若已知目标主机IP地址及子网掩码为192.168.1.0/24,那么广播地址即为192.168.1.255。(需要注意的是,255.255.255.255为受限广播地址,不能被使用),按照该地址发送数据包时,路由器将会把数据包发送给192.168.1.1 ~ 192.168.1.254下所有主机,如下图所示:

        本地广播用于本地网络内的通信(只能用于局域网下)。无论特定主机位于何种 IP 网络上,当前的主机始终可以使用 255.255.255.255 这个地址向本地网络上的每个节点发送数据包。比如,在192.168.0网段下的任意一台主机,向255.255.255.255发送数据包,那么在192.168.0网段下所有的主机将会收到该数据包,同时,该数据包也不会被转发到其他网段去。如下图所示:

拓展:

        如何知道一台主机是属于哪一个广播域?

        用主机的IP地址与子网掩码进行“与运算”即可知道该主机属于哪一个广播域。

        例如:一台主机的IP地址为192(1100 0000).168(1010 1000).23(0001 0111).150(1001 0110),子网掩码为255(1111 1111).255.255.0,那么它所属的广播域就是(实际计算是以二进制的哦~):

192.168.23.150 \wedge 255.255.255.0 = 192.168.23.0

        那么其它的在广播域192.168.23.0内的所有主机就可以收到该设备发送的广播包。

拓展:

        如何计算广播地址?

        广播地址的计算方法为子网掩码“取反”后再与广播域进行“或运算”。
        例如:主机当前所属广播域为192(1100 0000).168(1010 1000).0.0,子网掩码为255.255.0.0,那么广播地址为(\vee是或操作,即 | ;\sim是取反操作):

192.168.0.0 \vee (\sim255.255.0.0) = 192.168.255.255

广播的编程与实现

套接字选项设置

        广播的编程实现与多播类似,区别在于对套接字选项的设置。通过 setcokopt 函数,将选项级别设为 SOL_SOCKET ,对应选项为 SO_BROADCAST 。选项设置为1,表示“可以进行数据广播”。

int send_sock;
int so_brd = 1; //对变量进行初始化以将 SO_BROADCAST 选项信息设为 1 

send_sock = socket(PF_INET , SOCK_DGRAM , 0);

setsockopt(send_sock , SOL_SOCKET , SO_BROADCAST , (void*) & so_brd , sizeof(so_brd));

发送者

        在实现上与多播类似,主要集中在套接字选项的设置。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>

#define BUF_SIZE 1024

//报错消息发送
void Sender_message(char *message)
{
    puts(message);
    exit(1);
}


int main(int argc, char *argv[])
{
	int send_sock;
	struct sockaddr_in brd_addr;
	FILE *fp;
	char buf[BUF_SIZE];
	int so_brd=1;
	
	send_sock=socket(PF_INET, SOCK_DGRAM, 0);
    if(send_sock==-1)
    {
        Sender_message((char*)"socket creation error");
    }	
	memset(&brd_addr, 0, sizeof(brd_addr));
	brd_addr.sin_family=AF_INET;
	brd_addr.sin_addr.s_addr=inet_addr(argv[1]);
	brd_addr.sin_port=htons(atoi(argv[2]));
	
	setsockopt(send_sock, SOL_SOCKET, SO_BROADCAST, (void*)&so_brd, sizeof(so_brd));	
	fp=fopen(argv[3], "r");
    if(fp==NULL)
    {
		Sender_message((char*)"file open error");
    }

	while(!feof(fp))
	{
		fgets(buf, BUF_SIZE, fp);
		sendto(send_sock, buf, strlen(buf), 0, (struct sockaddr*)&brd_addr, sizeof(brd_addr));
	}

	close(send_sock);
	return 0;
}

接收者

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>

#define BUF_SIZE 1024

// 报错消息发送
void Sender_message(char *message)
{
    puts(message);
    exit(1);
}

int main(int argc, char *argv[])
{
    int recv_sock;
    struct sockaddr_in addr;
    int str_len;
    char buf[BUF_SIZE];

    recv_sock = socket(PF_INET, SOCK_DGRAM, 0);
    if (recv_sock == -1)
    {
        Sender_message((char *)"socket creation error");
    }
    memset(&addr, 0, sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = htonl(INADDR_ANY);
    addr.sin_port = htons(atoi(argv[1]));

    if (bind(recv_sock, (struct sockaddr *)&addr, sizeof(addr)) == -1)
    {
        Sender_message((char *)"bind error");
    }
    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;
}

运行结果:

拓展资料

[1] setsockopt函数功能及参数详解 - 博客园 

[2] 本地广播与定向广播到底有什么区别? - 知乎

[3] 多播与广播原理分析及区别 - CSDN博客

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【TCP/IP】广播 - 定义、原理及编程实现 的相关文章

  • 第二节课内容学习

    监听远程端口 并映射到本地 先配置ssh的公私钥非对称加密 假设远程开放的端口为33090 在本地计算机终端执行 ssh CNg L 6006 127 0 0 1 6006 root ssh intern ai org cn p 33090
  • 一个网工(网络工程师)七年的职业血泪史....

    前言 一个工作了七年的老网工 上家公司待了五年 现在这家公司也快三年了 分享一些我自己学习网络安全路上的一些经历 也算是帮大家少走些弯路 一 如何学习网络安全 1 不要试图以编程为基础去学习网络安全 不要以编程为基础再开始学习网络安全 一般
  • 广告竞价策略:激发广告变现潜能的关键

    在数字化时代 广告已经成为企业推广品牌 产品和服务的关键手段之一 为了最大程度地发挥广告的效果 广告竞价策略成为广告主和数字营销专业人士关注的焦点 通过巧妙运用竞价策略 广告主可以在激烈的市场竞争中脱颖而出 实现广告变现的潜能 admaoy
  • 网络基础面试题(二)

    11 什么是网桥 防火墙的端口防护是指什么 网桥是一种网络设备 用于连接两个或多个局域网 LAN 并转发数据包 它能够根据MAC地址来识别和转发数据 提高网络的传输效率和安全性 防火墙的端口防护是指对防火墙上的各个端口进行保护和限制 只允许
  • 6类典型场景的无线AP选型和部署方案

    你们好 我的网工朋友 前段时间刚给你们来了篇解决无线频繁断网的技术文 解决无线频繁断网 这个办法值得收藏 不少朋友私聊 说想再聊聊无线AP的选型和部署方案 这不就安排上了 无线网络覆盖项目中 无线AP的合理选型和部署非常重要 在设计施工中
  • 改善python程序的91建议记录

    使用else子句简化循环 异常处理 案例1 执行sql异常时处理 def save db obj try save attr1 db execute a sql stmt obj attr1 save attr2 db execute an
  • Linux中如何查看开启了哪些端口?

    在Linux中 端口是设备与外界通讯交流的出口 常用于指TCP IP协议中的端口 其按照端口号可以分为三类 分别是 公认端口 注册端口 动态端口 那么Linux中如何查看开启了哪些端口 以下是常用命令介绍 1 使用netstat命令 net
  • CMAKE_MAKE_PROGRAM is not set 解读

    目录 CMAKE MAKE PROGRAM 未设置 错误原因 解决方案 示例1 GNU Make 示例2 Ninja CMakeLists txt 的结构 示例 CMakeLists txt 文件 总结 CMAKE MAKE PROGRAM
  • 网络空间安全女生就业,怎么学?

    我实验室的学长们基本都是以红队和复现为主 如果学校好点可能还有更多的选择 如果想在这个方向深入下去 推荐流程是先打两年CTF 把大概的技术方向摸一摸 大一的话 如果学校还不错 那就优先建议打好基础 包括C语言 Python一类 建议把CTF
  • Linux 系统日志及其归档

    主要记录Linux 系统需要关注的日志文件 以及日志归档服务 rsyslogd 系统日志服务 rsyslogd 日志服务 rsyslogd reliable and extended syslogd 可靠 可扩展的系统日志服务 Rsyslo
  • 如何解读服务器的配置和架构?

    在当今数字化时代 服务器作为企业或组织的重要基础设施 其配置和架构对于保障业务的稳定运行至关重要 如何解读服务器的配置和架构 成为了一个备受关注的话题 本文将围绕服务器配置和架构的解读进行深入探讨 帮助读者更好地理解服务器的性能 扩展性和安
  • Web 安全漏洞之 OS 命令注入

    什么是 OS 命令注入 上周我们分享了一篇 Web 安全漏洞之 SQL 注入 其原理简单来说就是因为 SQL 是一种结构化字符串语言 攻击者利用可以随意构造语句的漏洞构造了开发者意料之外的语句 而今天要讲的 OS 命令注入其实原理和 SQL
  • 38条Web测试经验分享

    1 页面链接检查 每一个链接是否都有对应的页面 并且页面之间切换正确 可以使用一些工具 如LinkBotPro File AIDCS HTML Link Validater Xenu等工具 LinkBotPro不支持中文 中文字符显示为乱码
  • 线程安全(中)--彻底搞懂synchronized(从偏向锁到重量级锁)

    接触过线程安全的同学想必都使用过synchronized这个关键字 在java同步代码快中 synchronized的使用方式无非有两个 通过对一个对象进行加锁来实现同步 如下面代码 synchronized lockObject 代码 对
  • WEB前端常见受攻击方式及解决办法总结

    一个网址建立后 如果不注意安全问题 就很容易被人攻击 下面讨论一下集中漏洞情况和放置攻击的方法 一 SQL注入 所谓的SQL注入 就是通过把SQL命令插入到web表单提交或输入域名或页面请求的查询字符串 最终达到欺骗服务器执行恶意的SQL命
  • Jmeter 性能-并发量计算

    并发概念 指网站在同一时间访问的人数 人数越大瞬间带宽要求更高 服务器并发量分为 业务并发用户数 最大并发访问数 系统用户数 同时在线用户数 估算业务并发量的公式 C nL T C C 3 C的平方根 说明 C是平均的业务并发用户数 n是l
  • 「网络安全渗透」如果你还不懂CSRF?这一篇让你彻底掌握

    1 什么是 CSRF 面试的时候的著名问题 谈一谈你对 CSRF 与 SSRF 区别的看法 这个问题 如果我们用非常通俗的语言讲的话 CSRF 更像是钓鱼的举动 是用户攻击用户的 而对于 SSRF 来说 是由服务器发出请求 用户 日 服务器
  • 通俗易懂,十分钟读懂DES,详解DES加密算法原理,DES攻击手段以及3DES原理

    文章目录 1 什么是DES 2 DES的基本概念 3 DES的加密流程 4 DES算法步骤详解 4 1 初始置换 Initial Permutation IP置换 4 2 加密轮次 4 3 F轮函数 4 3 1 拓展R到48位 4 3 2
  • 【安全】简单解析统一身份认证:介绍、原理和实现方法

    深入解析统一身份认证 介绍 原理和实现方法 导语 统一身份认证是什么 统一身份认证的原理 统一身份认证的实现 结语 导语 随着互联网的发展和各种在线服务的普及 用户在不同的应用和平台上需要进行多次身份验证 为了简化用户的登录和减少重复操作
  • 【安全】网络安全态势感知

    文章目录 一 态势感知简介 1 概念 2 形象举例 3 应具备的能力 二 为什么要态势感知 为什么网络安全态势感知很重要 三 态势感知系统的功能 四 如何评估态势感知的建设结果 五 什么是态势感知的三个层级 四 业界的态势感知产品 1 安全

随机推荐

  • Python多行注释/取消注释快捷键

    step1 选中需要注释注释的所有代码 step2 按快捷键 系统 快捷键 Mac command Windows Linux Ctrl 取消注释同理 选中所有代码按快捷键 如果选中的代码中有注释有无注释 则会全部当做无注释加上注释
  • 必须要学的SQL Server 的常用语句(满满的干货),拿走不谢~~~

    文章目录 前言 一 基本常用语句 二 连接和分组 三 进阶级语句 函数 1 CASE WHEN 2 DATEDIFF 3 select嵌套 4 CAST 转换类型 5 GETDATE 函数 6 DISTINCT 总结 前言 前几天做项目的时
  • MS COCO数据集介绍

    本文直接从实用型角度介绍下coco数据集 以coco2014为例 下载资源以后 得到以下目录 annotations中存放的是一大堆json文件 注 带person和face的是我自己制作的json文件 截图时懒得删除 可以忽略 想了解如何
  • MPLS防环及IGP与LDP同步,理论+实战,两分钟全部掌握

    一 MPLS环路检测 LSP的防环是通过IGP路由防环的 只有IGP路由表中的下一跳分配的标签才会放入LFIB 只要IGP路由表没有环路 那么LSP也没有环路 LDP环路检测机制 1 距离向量法 标签绑定报文中记录路径信息 既标签交换路由器
  • 【Linux之Shell脚本实战】监控系统的磁盘空间使用率

    Linux之Shell脚本实战 监控系统的磁盘空间使用率 一 脚本要求 二 检查本地系统环境 1 检查系统版本 2 检查系统内核版本 三 编写disk sh脚本 1 创建脚本目录 2 编写disk sh脚本 3 执行测试脚本 四 查看脚本执
  • redis哨兵模式及主从配置

    例 现有3台服务器 需要配置1主1从3哨兵 服务器1 103 162 37 166 主 redis6380 哨兵1 sentinel26380 服务器2 103 162 37 167 从 redis6380 哨兵2 sentinel2638
  • 03-用Jupyter编写数学公式

    用jupyter编写数学公式 Contents 1 两种数学模式 2 空格 3 上标和下标 4 命令 5 符号 6 头标 7 括号 8 字体及其选项 9 转义字符 10 等式对齐 11 分段函数 12 一点总结 13 附录1 数学符号表 1
  • STM32F0x高级定时器之PWM模式

    脉冲宽度调制模式允许您生成一个信号 其频率由TIMx ARR寄存器的值确定 占空比由TIMx CCRx寄存器的值决定 通过在TIMx CCMRx寄存器的OCxM位中写入 110 PWM mode 1 或 111 PWM mode 2 可以在
  • WdatePicker 限制选择最小最大日期

    1 需求 限制最小 最大日期选择 如最小日期只能选择上一年度日期 最大日期只能选择到当天日期 2 解决 使用WdatePicker日期插件 设置minDate maxDate 代码如下 div class form group div
  • 通俗易懂的LLM(上篇)

    目录 前言 一 Tuning 1 Fine Tuning 微调 2 Prompt Tuning 提示微调 2 1 In context learning 上下文学习 2 2 Pattern Verbalizer Pair PVP 2 3 P
  • 分享一个卡通人物

    这几天较忙 像它一样 代码在这里
  • MySQL将以逗号分隔的数据分成多行,再合并为一行

    最近遇到个这样的问题 MySQL中的 影片表 中 演员列 的内容是用逗号分隔的多个id存储的 例 4356 9691 11337 然后需要把他换成id对应的演员名字 例 屈菁菁 王太利 肖央 看起来很复杂 其实只要把问题拆分一下就会非常简单
  • vue3+Element-plus el-select 下拉选择 多选增加全选封装组件(2023-09-20 TSelect组件新增自定义显示下拉项label)

    2023 09 20 TSelect组件新增自定义显示下拉项label 一 效果图 含适用于条件查询组件中使用 二 参数配置 1 代码示例
  • 16LinuxC进程间通信之mmap创建匿名映射区

    1 mmap创建匿名映射区 1 创建匿名映射区非常简单 只需要加上MAP ANONYMOUS即可 参数len长度可以随便大小 fd没有传 1即可 open这些函数可以不需要了 并且匿名映射实际上就是解决中间创建的文件问题 2 并且 匿名映射
  • 【杂记】YOLOv1至YOLOv8各版本发布时间及作者

    YOLO You Only Look Once 2015 6 8 Joseph Redmon YOLOv2 YOLO9000 2016 12 25 Joseph Redmon YOLOv3 2018 4 8 Joseph Redmon YO
  • 用c语言、java、c++编写一个程序,输出九九乘法表。

    先上代码 include
  • PS故障风海报制作技术分享

    1 首先找一张看起来很酷的图 也可以选择自己喜欢的图片 2 复制图层 点击添加图层样式 选择混合选项 在高级混合里面的通道选项 有R G B三个通道选项 默认是全部勾选的状态 选择其中一个勾掉 关于通道应该选择哪一个或者哪几个 可以挨个尝试
  • GMM高斯混合模型聚类的EM估计过程matlab仿真

    目录 1 算法概述 2 仿真效果 3 MATLAB源码 1 算法概述 高斯混合模型 Gaussian Mixed Model 指的是多个高斯分布函数的线性组合 理论上GMM可以拟合出任意类型的分布 通常用于解决同一集合下的数据包含多个不同的
  • 算法,C技能树测评

    产品功能 技能树是一个帮助 IT 领域学习者进行职业成长的一站式学习工具 UI界面 产品交互 算法技能树 左边是对应算法技能树的目录 中间是内容 每个小知识点里面都会有对应的题目 完成题目这里就会显示绿色 没完成的则为白色 在中间每一题都有
  • 【TCP/IP】广播 - 定义、原理及编程实现

    本文共计2974字 预计阅读时间4分钟 目录 广播 广播的原理及形式 广播的编程与实现 套接字选项设置 发送者 接收者 拓展资料 广播 广播 Broadcast 是指封包在计算机网络中传输时 目的地址为网络中所有设备的一种传输方式 这里所说