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

news2024/11/24 22:46:06

目录

广播

广播的原理及形式

广播的编程与实现

套接字选项设置

发送者

接收者

拓展资料


广播

        广播(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,那么广播地址为(\wedge是与操作,即&;\sim是取反操作):

192.168.0.0 \wedge (\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博客

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

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

相关文章

Android 13(T) - binder阅读(4)- 使用ServiceManager注册服务2

上一篇笔记我们看到了binder_transaction&#xff0c;这个方法很长&#xff0c;这一篇我们将把这个方法拆分开来看binder_transaction做了什么&#xff0c;从而学习binder是如何跨进程通信的。 1 binder_transaction static void binder_transaction(struct binder_proc *proc…

Java 面试知识点合集

一、基础篇 1.1 java基础 1.面向对象的特征&#xff1a;封装、继承、多态 (1).封装&#xff1a;属性能够描述事物的特征&#xff0c;方法能够描述事物的动作。封装就是把同一类事物的共性&#xff08;包括属性和方法&#xff09;归到同一类中&#xff0c;方便使用。 封装的…

音视频处理工具FFmpeg与Java结合的简单使用

一、什么是FFmpeg FFmpeg是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec&#xff0c;为了保证高可移植性和编解…

chatgpt赋能python:Python编写n!——让阶乘计算变得更简单

Python编写n!——让阶乘计算变得更简单 阶乘是高中数学中常见的运算&#xff0c;它的含义是从1到n的所有正整数相乘&#xff0c;用叹号表示为n!。例如&#xff0c;5! 1 2 3 4 5 120。在计算机编程中&#xff0c;我们常常需要计算阶乘。而Python作为一门便捷易用的编程语…

chatgpt赋能python:Python编程自动化办公–提升工作效率的利器

Python编程自动化办公 – 提升工作效率的利器 越来越多企业对协作和业务流程的优化提高了要求&#xff0c;自动化办公就是其中之一&#xff0c;而Python编程能够帮助我们实现高效自动化办公。Python是一种多用途&#xff0c;高效的编程语言&#xff0c;被广泛应用于应用程序开…

UE4/5动画系列(3.通过后期处理动画蓝图的头部朝向Actor,两种方法:1.通过动画层接口的look at方法。2.通过control rig的方法)

目录 蓝图 点积dot Yaw判断 后期处理动画蓝图 动画层接口 ControlRig: 蓝图 首先我们创建一个actor类&#xff0c;这个actor类是我们要看的东西&#xff0c;actor在哪&#xff0c;我们的动物就要看到哪里&#xff08;同样&#xff0c;这个我们也是做一个父类&#xff0…

chatgpt赋能python:Python程序员的秘密武器:给不及格成绩加分

Python程序员的秘密武器&#xff1a;给不及格成绩加分 Python是一个语法简洁、易学易用的编程语言&#xff0c;已经成为了很多程序员的首选语言。在学校中&#xff0c;很多学生选择学习Python作为他们的编程课程。然而&#xff0c;有时候即便是刻苦学习&#xff0c;踏实地完成…

3D定制化开发工具HOOPS如何满足EDA设计需求?(上)

HOOPS SDK 是由 Tech Soft 3D 公司开发和提供的一款软件开发工具包。HOOPS SDK 为开发者提供了强大的3D图形渲染和交互功能&#xff0c;用于构建高性能的工程、设计和制造应用程序。其主要功能包括&#xff1a;3D 图形渲染、交互性、数据管理、算法和分析、可定制性等。 HOOPS…

chatgpt赋能python:Python编写一个可以颠倒数组元素的函数

Python编写一个可以颠倒数组元素的函数 在Python编程中&#xff0c;我们经常需要对列表&#xff08;即数组&#xff09;进行操作。其中一个常见的操作就是颠倒列表中各元素的排列顺序。这个操作在很多场景下都有用&#xff0c;例如逆序输出字符串、逆序遍历二叉树等等。在本篇…

Atlas 200I DK A2开发者套件通过路由器联网(360安全路由-V2)

一、参考资料 Windows系统 通过直连路由器连接外部网络 二、准备工作 准备micro SD存储卡&#xff0c;即TF卡&#xff0c;建议128GB以上&#xff1b;准备micro SD读卡器&#xff1b;准备普通网线一根&#xff1b;准备一个路由器&#xff0c; 360安全路由-V2路由器。 三、关键…

机器人开发--SLAM详细介绍

机器人开发--SLAM介绍 1 介绍1.1 概述1.2 发展历程三个时代重要时间节点视觉SLAM分类及里程碑技术发展 1.3 SLAM与各模块关系1.5 SLAM分类1.4 应用领域 2 SLAM框架视觉/惯性SLAM系统框架结构经典框架 3 常见方案3.1 常见激光雷达方案3.2 常见视觉方案3.3 多传感器融合方案 4 地…

chatgpt赋能python:Python中同一变量多次赋值的探讨

Python中同一变量多次赋值的探讨 介绍 Python是一种非常流行的编程语言&#xff0c;具有易于学习和使用、强大的功能和可扩展性、广泛的应用领域等众多优点。在Python中&#xff0c;我们可以对同一变量多次进行赋值&#xff0c;这在某些情况下非常有用。本文将探讨在Python中…

2.3、Bean的管理

一、Bean的装配&#xff08;IOC应用实现&#xff09; 创建应用组件之间的协作的行为通常称为装配&#xff08;wiring&#xff09;。Spring IOC通过应用上下文&#xff08;ApplicationContext&#xff09;装载Bean的定义并把他们组装起来。 Spring应用上下文&#xff08;Applica…

yum安装LNMP

目录 前言 一、yum安装要用在线yum源 二、安装Nginx 1、搭建Nginx环境 2、安装yum 3、查看Nginx是否安装成功 4、设置开机自启 三、安装MySQL 1、除系统中所有以"mariadb"开头的软件包 2、安装MySQL 3、设置开机自启 4、查看MySQL初始密码 5、修改MySQL密码…

第 107 场LeetCode双周赛

A 最大字符串配对数目 显然各字符串对 间匹配的先后顺序不影响最大匹配数目, 可以从后往前遍历数组, 判断前面是否有和当前末尾构成匹配的. class Solution { public:int maximumNumberOfStringPairs(vector<string> &words) {int res 0; while (words.size…

Python基础五

目录 一、Ptyhon数据类型--元组 1.元组的注意事项 2.元组的下标 3.访问元组元素 4.拼接元组 5.删除元组 6.元组运算符 二、Python内置函数--元组相关 一、Ptyhon数据类型--元组 Python 的元组与列表类似&#xff0c;不同之处在于元组的元素不能修改&#xff0c;也不能…

chatgpt赋能python:Python编写预警系统——保障企业安全的得力工具

Python编写预警系统——保障企业安全的得力工具 随着互联网应用的发展&#xff0c;企业所要面对的风险和威胁也与日俱增&#xff0c;预警系统的作用在保障企业安全中越来越显著。Python编写预警系统&#xff0c;成为了许多企业和团队的首选&#xff0c;具有方便快捷、灵活多样…

【软考网络管理员】2023年软考网管初级常见知识考点(13)-ARP、ICMP、IPv6协议详解

#涉及知识点 ARP协议详解、ICMP协议详解、IPv6协议等软考内容详解 软考网络管理员常考知识点&#xff0c;软考网络管理员网络安全&#xff0c;网络管理员考点汇总。 原创于&#xff1a;CSDN博主-《拄杖盲学轻声码》&#xff0c;更多考点汇总可以去他主页查看 文章目录 前言一、…

浅析AI深度学习计算机视觉技术在智能监控领域的场景应用

计算机视觉技术是一种模拟人类视觉功能的技术&#xff0c;通过数字图像处理、模式识别、机器学习等方法&#xff0c;自动分析和理解图像和视频中的信息&#xff0c;从而实现图像和视频的自动理解、识别、分类、检测和跟踪等任务。 计算机视觉技术的使用场景非常广泛&#xff0…

第十四章 Vision Transformer网络详解

系列文章目录 第一章 AlexNet网络详解 第二章 VGG网络详解 第三章 GoogLeNet网络详解 第四章 ResNet网络详解 第五章 ResNeXt网络详解 第六章 MobileNetv1网络详解 第七章 MobileNetv2网络详解 第八章 MobileNetv3网络详解 第九章 ShuffleNetv1网络详解 第十章…