UDP广播的实现

2023-05-16

一、广播的概念

广播:由一台主机向该主机所在子网内的所有主机发送数据的方式。

            任何一个网段最后一个地址就是广播的地址

例如:192.168.5.103主机发送广播信息,那么,广播地址为192.168.5.255

则192.168.5.1~192.168.5.254所有主机都可以接收到数据。

广播的MAC地址:ff.ff.ff.ff.ff.ff

注意:广播只能用UDP或原始IP实现,不能用TCP

1.1、广播用途

    单个服务器与多个服务器主机通信时减少分组流通。
以下几个协议都用到广播:

(1)地址解析协议(ARP)
         通过IP,获取对方的MAC地址

(2)动态主机配置协议(DHCP)
         自动获取主机IP

(3)网络时间协议(NTF)
          获取当前时间

1.2、UDP广播的特点

1、处于同一子网的所有主机都必须处理数据
2、UDP数据包会沿协议栈向上一直到UDP层
3、运行音视频等较高速率工作的应用,会带来大负
4、局限于局域网内使用

1.3、UDP广播的地址

【网络ID,主机ID】
        网络ID 表示:由子网掩码中1覆盖的连续位
        主机ID 表示:由子网掩码中0覆盖的连续位


定向广播地址主机ID全1
 例:  对于192.168.220.0/24,其定向广播地址为192.168.220.255
          通常路由器不转发该广播


受限广播地址255.255.255.255
            路由器从不转发该广播

注意:在某一个局域网内广播,选择定向广播。若想在多个局域网内广播,只能选择受限广播

二、广播、多播、单播对比

2.1、单播(1对1)

单播:在同一网络内,两个设备点对点的通信就是单播通信。

打个比方:学生打小报告,学生悄悄找班主任说明情况。是不是两个人之间的对话——学生和班主任。那么用网络技术的术语来描述就是“单播”,此时信息的接收和传递只在两个节点之间进行

应用场景:收发电子邮件、浏览网页等等。

2.2、多播(1对多,此多是指定某个组)

多播:在同一网络可达范围内,一个网络设备与关心其数据的部分设备进行通信就是组播。

打个比方班主任  找   班干部  开会,地点在会议室,讨论如何管理班级学生(传输数据)。那么在网络技术上,班主任是一个正在使用多播的网络设备,而 班干部  作为班主任指定传输的对象,注意:此指定不是班主任指定的,只有当班干部进入会议室里,才可以接收到班主任派发的信息。

如果有一位班干部生病了,没来,他是不能收到信息的。

再比如:我是“史上最强大学生”的群群主,我发信息在群里(即我在使用多播),只有进入此群的人才可以接收到信息。没进的,收不到信息。你明白了??

应用场景:网上视频会议、网上视频点播等等

2.3、广播(1对所有)

广播::在同一网络可达范围内,一个网络设备向本网络内所有设备进行通信就是广播

打个比方:开会,在会场上只能有一个人拿着麦克风发言,他的发言在场的所有人都能听到。这就是广播。

三、分析广播传输

3.1、分析发送应用进程流程

 第一步:创建套接字——socket函数

第二步:设置为UDP协议和端口号(此端口为 对方的端口号 )

第三步:设置IPV4,由于是广播,ip地址  为主机ID全1.

              打个比方,我的ip地址为192.168.5.121,那么我的广播地址为192.168.5.255

第四步:设置传输为以太网,mac地址为专属广播地址   即:ff.ff.ff.ff.ff.ff

3.2、分析如何传输与接收

第一步:把打包好数据包,传送该主机所在子网内的所有主机   都发送数据包。

第二步:子网下的每一个主机都会通过数据链路,和网络层。

第三步:每个子网下的主机都会对比端口号,是否传输给我,是,就接收,不是,不接收(也可以主动接收)。

四、广播流程

发送者:
第一步:创建套接字 socket()
第二步:设置为允许发送广播权限 setsockopt()
第三步:向广播地址发送数据 sendto()


接收者:
第一步:创建套接字 socket()
第二步:将套接字与广播的信息结构体绑定 bind()
第三步:接收数据 recvfrom()

五、套接字选项(设置是否允许用广播发送)

头文件:

                 #include <sys/socket.h>
 函数:

      int setsockopt(int socket, int level, int option_name, const void *option_value, socklen_t option_len);
功能:

                设置一个套接字的选项(属性)
参数:
                socket:文件描述符
                 level:协议层次
                             SOL_SOCKET 套接字层次
                              IPPROTO_TCP tcp层次
                              IPPROTO_IP IP层次
                option_name:选项的名称
                              SO_BROADCAST 允许发送广播数据(SOL_SOCKET层次的)
                option_value:设置的选项的值
                                        int类型的值,存储的是bool的数据(1和0)

                                         0 不允许
                                         1 允许
                   option_len:option_value的长度
返回值:
                成功:0
                失败:‐1

六。广播示例

6.1、发送者(代码)

#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h>         
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main(int argc  ,char *argv[])
{
	if(argc<3)
	{
		printf("error lose ip port\n");
		exit(1);
		
		}

	int sockfd;

	if((sockfd=socket(AF_INET,SOCK_DGRAM,0))==-1)
	{
		
		perror("fail to sockfd");
		exit(1);
		
 		}
	int on =1;

   if(setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&on,sizeof(on))==-1)
   {
	   perror("fail to setsockopt");
	   exit(1);
	   }
    struct sockaddr_in mysockaddr;

	mysockaddr.sin_family = AF_INET;
	mysockaddr.sin_port =htons(atoi(argv[2]));
	mysockaddr.sin_addr.s_addr=inet_addr(argv[1]);
	socklen_t addrlen= sizeof(mysockaddr);

	char buf[128];
	while(1)
	{	
        fgets(buf,sizeof(buf),stdin);
    

	 if(sendto(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&mysockaddr,addrlen)==-1)
	 {
		 perror("fail to sendto");
		 exit(1);
		 
		 }	    	
	
	}
	
	  close(sockfd);
	
	
	return 0;
	  
	}

6.2、接收者(代码)

#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h>         
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>



int main(int argc  ,char *argv[])
{
    if(argc<3)
	{
		printf("input fail lose ip port");
		exit(1);
		
		}

	int sockfd;

	if((sockfd=socket(AF_INET,SOCK_DGRAM,0))==-1)
	{
		
		perror("fail to sockfd");
		exit(1);
		
 		}

    struct sockaddr_in mysockaddr;
   
	mysockaddr.sin_family = AF_INET;
	mysockaddr.sin_port =htons(atoi(argv[2]));
	mysockaddr.sin_addr.s_addr=inet_addr(argv[1]);
	socklen_t addrlen= sizeof(mysockaddr);
    
	if(bind(sockfd,(struct sockaddr *)&mysockaddr,addrlen)==-1)
	{
		perror("fail to bind");
		exit(1);
		}
	char buf[128];
	struct sockaddr_in sendsockaddr;
	socklen_t sendaddrlen=sizeof(sendsockaddr);
	while(1)
	{	
      
	 if(recvfrom(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&sendsockaddr,&sendaddrlen)==-1)
	 {
		 perror("fail to recvfrom");
		 exit(1);
		 
		 }
		 printf("[%s ‐ %d]: %s\n", inet_ntoa(sendsockaddr.sin_addr), ntohs(sendsockaddr.sin_port),buf);

 
	}
	
	  close(sockfd);
	
	
	return 0;
	  
	}

允许结果

 

总结:由于只有一台主机,无法更加深刻感受到广播的强大。

发送者:把需要发送的信息发到——广播地址当中,从众多子网下 找到相对应的端口号,传输给对方。

接收者,绑定自己的ip,设置相对应的端口号。

不理解的地方:就是接受者不设置成广播地址,无法接收发送者传输的信息。

理想情况,不应该是我设置成子网ip,端口号一致,就可以收到信息。

我总结为:unbantu所运行的两个程序,都是在同一个ip中。或者只有一台主机的问题。

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

UDP广播的实现 的相关文章

  • windows下vscode连接Linux中的MySQL(非常实用)

    于初学Linux系统的小伙伴来说 xff0c 由于对Linux系统及其在windows下的环境配置比较生疏 xff0c 所以当使用windows下vscode连接Linux中的MySQL xff0c 并进行相关研发时 xff0c 颇为头疼
  • UDP通信实现(客户端和服务器端)

    服务器端 xff1a include lt stdio h gt include lt stdlib h gt include lt unistd h gt include lt string h gt include lt arpa in
  • conda环境的激活与关闭

    激活conda环境 conda activate 关闭conda环境 conda deactivate 打开终端自动进入conda环境 conda config set auto activate base true 关闭打开终端自动进入c
  • C语言结构体字节对齐规则

    注 xff1a 图片中蓝色圆圈表示空闲的字节空间 xff0c 黄色表示成员占有的字节空间 编译器一般默认4字节对齐 xff0c 当然也有8字节对齐的 xff0c 但是如果结构体没有使用8字节的数据类型 xff0c 其实也可以认为是4字节对齐
  • c语言输出对齐的方法

    关于c语言输出对其方法 左对齐右对齐附乘法表代码 左对齐 当输出多个数据时 xff0c 由于每个数据的字符长度不同 xff0c 所以需要对齐 xff0c 左对齐时方法如下 xff1a span class token function pr
  • 多线程与网络编程

    一 网络协议 应用层 HTTP FTP TFTP SMTP SNMP DNS 传输层 TCP UDP 网络层 ICMP IGMP IP ARP RARP 数据链路层 由底层网络定义的协议 物理层 由底层网络定义的协议 二 TCP与UDP x
  • const和define区别与比较

    xff08 1 xff09 就起作用的阶段而言 xff1a define是在编译的预处理阶段起作用 xff0c 而const是在编译 运行的时候起作用 xff08 2 xff09 就起作用的方式而言 xff1a define只是简单的字符替
  • FreeRTOS中任务栈内存分配

    前言 在RAM中大多数的空间分配为任务栈和系统栈两部分 任务栈 xff1a 顾名思义就是用来跑任务的 xff0c 当我们xTaskCreate一个任务时 xff0c 但是在这块任务栈里面动态分配空间 系统栈 xff1a 任务栈是不使用这里的
  • 网络编程(0816-林雪阵)

    完成seclect TCP客户端 include lt stdio h gt include lt sys types h gt include lt sys socket h gt include lt arpa inet h gt in
  • yolov5获取边框坐标

    这里使用的是5 0版本 打开detect py xff0c 找到 Write results模块 xff0c 找到 save one box ctr 43 鼠标点击 xff0c 进入general py xff0c 会自动定位到 save
  • ROS介绍以及常用指令

    ROS 1 什么是ros ROS 的雏形诞生 xff1a 斯坦福大学人工智能实验室的STAIR 机器人项目这个项目希望完成一个服务机器人原型 xff0c 在视觉的辅助下 xff0c 可以在复杂环境中运动 xff0c 还可以通过机械臂操控环境
  • 基于ROS的YOLOV3实现目标检测项目过程记录

    2020 08 07 问题记录 1 要命的darknet ros 整体逻辑是用yolo检测出目标 然后通过ros节点将目标类别和位置信息发布出来 因此选择ros darknet 2个问题 1 依赖opencv和boost boost库安装过
  • 【Jetson目标检测SSD-MobileNet应用实例】(五)根据输出的检测结果,使用串口和STM32配合进行电机控制

    Jetson目标检测SSD MobileNet应用实例 xff08 一 xff09 win11中配置SSD MobileNet网络训练境搭建 Jetson目标检测SSD MobileNet应用实例 xff08 二 xff09 制作自己的数据
  • QT5.14串口调试助手:上位机接收数据解析数据帧+多通道波形显示+数据保存为csv文件

    由于业务需要 xff0c 在上个月做了一个关于qt的设计 xff0c 在设计中主要需要解决的问题就是接收单片机采集到的数据并在上位机将数字实时的通过波形显示出来 xff0c 然后上位机要有保存下数据文件的功能 xff0c 便于后续的软件读取
  • 如何使用Cmake编译

    目录 一 Cmake是一种跨平台编译工具 二 CMake说明 三 编写CMakeList txt 四 使用 cmake 一 Cmake是一种跨平台编译工具 比make更高级 xff0c 使用起来要方便得多 CMake主要是编写CMakeLi
  • 51单片机串口通信篇

    串行通信 基本介绍波特率通信校验内部结构 并行通信串行通信串行通信方式同步通信异步通信 串行口的控制寄存器SCON寄存器PCON寄存器中断源及优先级 串口通信配置步骤 相关程序简单例程1简单例程2 基本介绍 单片机通信是指单片机和单片机 或
  • 0基础学会 UDP通信(内附C语言源码)

    include lt sys types h gt include lt sys socket h gt ssize t sendto int socketfd const void buf size t len int flags con
  • C++ --头文件和类的声明

    函数 function 是为了处理数据 数据的实质就是变量 xff08 variables xff09 C是所有的函数都可以去处理任意声明的变量 C 43 43 面向对象的编程思想就是 把函数名和变量名封装起来 xff08 也就是类 xff
  • gcc编译可执行文件和cmake编译可执行文件

    gcc编译 gcc的下载 xff08 下载mingw xff0c 里面包含gcc xff09 下载安装MinGW w64详细步骤 xff08 c c 43 43 的编译器gcc的windows版 xff0c win10真实可用 xff09
  • 常用传感器讲解十九--超声波感器(HC-SR04)

    常用传感器讲解十九 超声波感器 xff08 HC SR04 xff09 具体讲解 HC SR04超声波距离传感器的核心是两个超声波传感器 一个用作发射器 xff0c 将电信号转换为40 KHz超声波脉冲 接收器监听发送的脉冲 如果接收到它们

随机推荐

  • C++中vector作为参数的三种传参方式(传值 && 传引用 && 传指针)

    c 43 43 中常用的vector容器作为参数时 xff0c 有三种传参方式 xff0c 分别如下 xff1a function1 vector vec xff0c 传值 function2 vector amp vec xff0c 传引
  • 斯坦福机器狗的介绍

    添加链接描述 斯坦福机器狗的介绍 Stanford Doggo 现在已经能完成走路 慢跑 跳舞 跳跃等动作 xff0c 偶尔还能表演一下后空翻 机械结构组成 同轴机制 同轴机制 xff08 coaxial mechanism xff09 会
  • 基于ROS的车道线检测项目记录

    2020 09 06 任务 xff1a 传统OpenCV方法ROS版本改造 选取大神陈光的高级车道线检测方法进行改造 xff0c 总体逻辑是 xff1a 第一 创建订阅者 xff0c 接收摄像头发布的数据 xff0c 用cv bridge将
  • ACEINNA发布用于自动驾驶汽车的IMU330RA

    IMU技术是自动驾驶汽车中ADAS导航系统和安全系统的关键构成部分 常规环境下 xff0c 感知传感器 xff08 激光雷达 摄像头 雷达 里程计等 xff09 用来确保车辆行驶在正确的路径上 但是 xff0c 如果感知传感器由于车辆位置或
  • 无刷电机与odrive

    无刷电机 无刷电机的优点 能获得更好的扭矩转速特性高速动态响应高效率长寿命低噪声高转速 无刷电机的简介 无刷直流电机由电动机主体和驱动器组成 xff0c 是一种典型的机电一体化产品 由于无刷直流电动机是以自控式运行的 xff0c 所以不会像
  • 无刷舵机 数字舵机 模拟舵机

    舵机 1 无刷舵机 xff1a 由 xff1a 电机 减速齿轮组 反馈电位器 控制电路构成 主电机可以使用无刷电机 xff0c 减少磨损延长使用寿命 模拟舵机需要给它不停的发送PWM信号 xff0c 才能让它保持在规定的位置或者让它按照某个
  • PCA9685如何通过iic协议控制多个舵机

    iic协议 即I2C xff0c 一种总线结构 能够有效减少芯片管脚和线路连接的数量 例如 内存中的SPD信息 通过IIC xff0c 与BX芯片组联系 xff0c IIC 存在于英特尔PIIX4结构体系中 随着大规模集成电路技术的发展 x
  • 无人机电池模块

    3 电池模块 xff1a 1 xff1a 电池的多少mah什么意思 xff1f 表示电池容量 xff0c 如5200mah电池 xff0c 表示以5 2A的电流放电 xff0c 可持续放电1小时 但是 xff0c 实际的放电时间还是要参考厂
  • 每日漏洞 | 跨站请求伪造

    01 漏洞描述 HTTP的无状态性 xff0c 导致Web应用程序必须使用会话机制来识别用户 一旦与Web站点建立连接 访问 登录 xff0c 用户通常会分配到一个Cookie xff0c 随后的请求 xff0c 都会带上这个Cookie
  • 每日漏洞 | rsync未授权访问

    01 漏洞描述 rsync是Linux Unix下的一个远程数据同步工具 xff0c 可通过LAN WAN快速同步多台主机间的文件和目录 xff0c 默认运行在873端口 由于配置不当 xff0c 导致任何人可未授权访问rsync xff0
  • 每日漏洞 | 不安全的HTTP方法

    01 漏洞描述 HTTP HTTP报文 中介绍了HTTP的请求方法 在这些方法中 xff0c HTTP定义了一组被称为安全方法的方法 xff1a GET HEAD OPTIONS TRACE xff0c 这些方法不会产生什么动作 xff0c
  • 每日漏洞 | Host头攻击

    01 漏洞描述 HTTP HTTP报文 最后一节 xff0c 简单的介绍了一下首部字段 xff0c 其中就包含了Host首部字段 为了方便获取网站域名 xff0c 开发人员一般依赖于请求包中的Host首部字段 例如 xff0c 在php里用
  • 每日漏洞 | HTTP.sys远程代码执行

    01 漏洞描述 上篇文章介绍了Host头攻击 xff0c 今天我们讲一讲HTTP sys远程代码执行漏洞 HTTP sys是Microsoft Windows处理HTTP请求的内核驱动程序 xff0c 为了优化IIS服务器性能 xff0c
  • miivii域控制器(Xavier)实现TensorRT加速后的Ultra-Fast-Lane-Detection项目

    TRT ONNX2是神力模型转换工具链 鸡汤哥知乎金天 一 配置TRT ONNX2 1 安装依赖 xff08 2020 09 30更新 xff09 昨天刷了JetPack4 4 xff0c 很好用 xff01 只需要下载编译thor即可 x
  • 每日漏洞 | CRLF注入

    01 漏洞描述 在 HTTP HTTP报文 一文中 xff0c 我们介绍了HTTP报文的结构 xff1a 状态行和首部中的每行以CRLF结束 xff0c 首部与主体之间由一空行分隔 或者理解为首部最后一个字段有两个CRLF xff0c 首部
  • PTES-情报搜集

    01 概述 在 PTES 渗透测试执行标准 中介绍了渗透测试的一般流程 xff0c 其中简要介绍了情报搜集的目标 情报搜集的目标是尽可能多的收集渗透对象的信息 网络拓扑 系统配置 安全防御措施等 xff0c 在此阶段收集的信息越多 xff0
  • 每日命令 | ls

    01 每日命令系列导语 安全行业 xff0c 接触Linux不可避免 今天我们开启Linux学习之旅 一直在构思Linux系列文章该怎么排版 xff0c 最终决定采用每日命令的形式 xff0c 毕竟Linux有大量的命令需要学习 每日命令系
  • c51单片机(预备知识)

    1 什么是单片机 单片机又称单片微控制器 它不是完成某一个逻辑功能的芯片 而是把一个计算机系统集成到一个芯片上 相当于一个微型的计算机 xff0c 和计算机相比 xff0c 单片机只缺少了I O设备 xff08 小键盘 LED显示器 xff
  • 一级指针和二级指针的传参问题(学习笔记)

    一 指针 一级指针 xff1a 是一个指针变量 xff0c 指向一个普通变量 xff0c 并保存该普通变量的地址 二级指针 xff1a 是一个指针变量 xff0c 指向一个一级指针 xff0c 并保存该一级指针的地址 二 一级指针的引用 2
  • UDP广播的实现

    一 广播的概念 广播 xff1a 由一台主机向该主机所在子网内的所有主机发送数据的方式 任何一个网段最后一个地址就是广播的地址 例如 xff1a 192 168 5 103主机发送广播信息 xff0c 那么 xff0c 广播地址为192 1