概述:
网络上的广播指:由一台主机向该主机所在子网内(同一个局域网)的所有主机发送数据的方式

实现广播,离不开广播地址,同一个子网(局域网)的所有主机网卡都会接收所在网段广播地址的数据包。广播地址应用于局域网内的所有主机。

广播地址(Broadcast Address)==专门用于同时向网络中(通常指同一子网)所有工作站进行发送的一个地址

1. 网络通信基础

如果网络中两个主机上的应用程序要相互通信,其一要知道彼此的IP,其二要知道程序可监听的端口。因为同一主机上的程序使用网络是通过端口号来区分的。

2. 广播地址

2.1 受限广播(本地广播)

路由器从来不会转发受限广播的数据包,但同一个子网的所有主机都会接收到受限广播的数据包。

本地广播: IP 地址的网络字段和主机字段全为 1 就是受限广播地址255.255.255.255。,它不经路由转发,发送本地网络下的所有主机,只能在局域网内转发,主要是不用知道目标主机的掩码与网络地址,本地转发同本地网络下的所有主机。

2.2 直接广播

计算方法通过主机的掩码与网络地址计算出来。掩码最后为0的位为主机位。掩码与网络地址相与,然后主机位全变为1,就是直接广播地址。这样改网络地址下的所有主机都能接收到广播。可以通过ifconfig查看,如下图所示:

直接广播可以被路由转发,发送到目标网络的所有主机,如:ip地址为 192.168.2.1的主机也可以发送广播到 192.168.1.0 这个网络。当然不是所有的路由器,通常路由器是默认阻止直接广播的(可以设置不阻止)。

IP 地址的网络字段定义这个网络,主机字段通常全为 1,如192.168.10.0/24 的直接广播(定向广播)地址为:192.168.10.255。

2.3 受限广播与直接广播的区别

两者的区别就是,本地广播在不知道目标主机的网络地址下,如果目标主机是在本地网络,可以发送本地广播,本地网络下的所有主机都能接收广播。直接广播是目标主机的网络地址知道,那该网络地址网段下的所有主机都能收到广播,直接广播更精确范围更小些

3. 广播特点

3.1 广播分为两端,即数据发送端和数据接收端,通过广播的方式发送数据,发送端和接收端的关系是 1:N

3.2发送广播消息的一端,通过广播地址,可以将消息同时发送到局域网的多台主机上(数据接收端)

3.3 在发送广播消息的时候,必须要把数据发送到广播地址上

3.4 广播只能在局域网内使用,广域网是无法使用UDP进行广播的

3.5 只要发送端在发送广播消息,数据接收端就能收到广播消息,消息的接收是无法拒绝的,除非将接收端的进程关闭,就接收不到了。当端口不匹配的话,数据才会丢弃

UDP 的广播和日常生活中的广播是一样的,都是一种快速传播消息的方式,因此广播的开销很小,发送端使用一个广播地址,就可以将数据发送到多个接收数据的终端上,如果不使用广播,就需要进行多次发送才能将数据分别发送到不同的主机上。

4. 设置UDP广播属性

基于 UDP 虽然可以进行数据的广播,但是这个属性默认是关闭的,如果需要对数据进行广播,那么需要在广播端代码中开启广播属性,需要通过套接字选项函数setsockopt进行设置

/*
函数:setsockopt
描述:设置广播属性
参数:sockfd:进行 UDP 通信的文件描述符level: 套接字级别,需要设置为 SOL_SOCKEToptname:选项名,此处要设置 udp 的广播属性,该参数需要指定为:SO_BROADCASToptval:如果是设置广播属性,该指针实际指向一块 int 类型的内存该整型值为 0:关闭广播属性该整形值为 1:打开广播属性optlen:optval 指针指向的内存大小,即:sizeof(int)返回值:函数调用成功返回 0,失败返回 - 1
*/
int setsockopt(int sockfd, int level, int optname,  const void *optval, socklen_t optlen);

5. 广播流程

假如我们要向192.168.200.X,子网掩码为:255.255.255.0的子网中发送广播包。***广播端步骤如下:
1.       include相关库文件。
2.       socket函数创建SOCK_DIRAM类型的socketfd。
3.       setsockopt设置socketfd的属性允许其广播。
4.       发送数据包到192.168.200.255
5.       关闭socketfd
注意事项如下:
6.       接收方一定要知道广播方的端口号,然后绑定此端口号才能正确接收。接收端的端口号要与广播端绑定的端口号一样
7.       接收方的Socket不需要设置成广播属性。
8.       绑定的IP不可以使用“127.0.0.1”,可以使用真实IP地址或者INADDR_ANY。否则接收失败***接收端步骤
1.       include相关库文件。
2.       socket函数创建SOCK_DIRAM类型的socketfd。
3.       bind绑定端口号与本地IP地址
4.       接收广播端数据
5.       关闭socketfd

6 代码举例

6.1 广播端代码

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>int main()
{// 1. 创建通信的套接字int fd = socket(AF_INET, SOCK_DGRAM, 0);if(fd == -1){perror("socket");exit(0);}// 2. 设置广播属性int opt  = 1;setsockopt(fd, SOL_SOCKET, SO_BROADCAST, &opt, sizeof(opt));char buf[1024];struct sockaddr_in cliaddr;int len = sizeof(cliaddr);cliaddr.sin_family = AF_INET;cliaddr.sin_port = htons(9999); // 接收端需要绑定9999端口// 只要主机在237网段, 并且绑定了9999端口, 这个接收端就能收到广播消息inet_pton(AF_INET, "192.168.200.255", &cliaddr.sin_addr.s_addr);//
//  inet_pton(AF_INET, "255.255.255.255", &cliaddr.sin_addr.s_addr);  //使用受限广播也可以正常通讯// 3. 通信int num = 0;while(1){sprintf(buf, "hello client : %d\n", num++);// 数据广播sendto(fd, buf, strlen(buf)+1, 0, (struct sockaddr*)&cliaddr, len);printf("发送的广播的数据: %s\n", buf);sleep(1);}close(fd);return 0;
}

6.2 接收端代码

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>int main()
{// 1. 创建通信的套接字int fd = socket(AF_INET, SOCK_DGRAM, 0);if(fd == -1){perror("socket");exit(0);}// 2. 通信的套接字和本地的IP与端口绑定struct sockaddr_in addr;addr.sin_family = AF_INET;addr.sin_port = htons(9999);    // 大端addr.sin_addr.s_addr = INADDR_ANY;  // 0.0.0.0int ret = bind(fd, (struct sockaddr*)&addr, sizeof(addr));if(ret == -1){perror("bind");exit(0);}char buf[1024];// 3. 通信while(1){// 接收广播消息memset(buf, 0, sizeof(buf));// 阻塞等待数据达到recvfrom(fd, buf, sizeof(buf), 0, NULL, NULL);printf("接收到的广播消息: %s\n", buf);}close(fd);return 0;
}

参考于:

  1. https://subingwen.cn/linux/broadcast/#4%E9%80%9A%E4%BF%A1%E4%BB%A3%E7%A0%81
  2. https://blog.csdn.net/weixin_43790540/article/details/104239594
  3. https://blog.csdn.net/maopig/article/details/7331898

linux socket UDP广播相关推荐

  1. LInux模拟UDP广播

    文章目录 1.使用nc命令模拟UDP单播 2.Linux C程序模拟UDP广播 1.使用nc命令模拟UDP单播 操作如下: 服务端 root@virtual-machine:/home/wangji# ...

  2. 基于UDP广播的局域网聊天工具

     最近项目在做一个基于UDP模式的通信程序,考虑到项目的需求有一对多的需要,所以采用socket UDP广播模式进行数据通信.网上了解了一下知道这种模式也是目前QQ采用的方式,于是为了更好的理解s ...

  3. python udp 直播_[Python] socket发送UDP广播实现聊天室功能

    原博文 2018-11-24 12:33 − 一.说明 本文主要使用socket.socket发送UDP广播来实现聊天室功能. 重点难点:理解UDP通讯流程.多线程.UDP广播收发等. 测试环境:Wi ...

  4. UDP广播之socket bad address 错误被解决,舒服

    在编写UDP广播程序编写完后,一编译,提示socket bad address.后面查资料得知在读取socket缓冲的时候,发送端sendto返回值正常,接收端recvfrom却读不到信息,是因为指针 ...

  5. Android 通过局域网udp广播自动建立socket连接

    Android开发中经常会用到socket通讯.由于项目需要,最近研究了一下这方面的知识. 需求是想通过wifi实现android移动设备和android平台的电视之间的文件传输与控制. 毫无疑问这中 ...

  6. linux下使用C语言实现UDP广播

    说明: 该代码演示了UDP广播的实现,通过UDP广播,可以向同一网段内的所有主机发送信息. 效果图 客户端(广播端): 服务端1: 服务端2: 源码 UDP广播实现: 通过UDP广播来实现消息的广播功 ...

  7. linux socket高性能服务器处理框架

    这个博客很多东西 http://blog.csdn.net/luozhonghua2014/article/details/37041765 思考一种高性能的服务器处理框架 1.首先需要一个内存池,目 ...

  8. Linux Socket详解 大全 基础知识

    1. Socket基础概念: 1.1:形象类比: Socket和电话网络的概念可以做一个很好的类比: Linux 编程中所说的socket就如同一个端点,类比到电话网中,它就如同一个电话机. 而Soc ...

  9. Qt | UDP广播通信的使用、实战项目使用案例

    Qt | UDP广播通信的使用.实战项目使用案例 1.UDP广播介绍 UDP广播地址固定IP地址为:XXX.XXX.XXX.255. 如果向全网段发送广播消息,那么广播地址为:255.255.255. ...

最新文章

  1. 2022-2028年中国再生天然橡胶行业市场调查分析及未来前景分析报告
  2. java ee开发技术 上海大学_学院介绍
  3. Zookeeper+kafka集群搭建,问题(zoo.cfg file is running,it‘s probably not running,option ‘UseCompressedOops‘)
  4. '0','\0',NULL,EOF的区别
  5. mysql触发器 生僻字_MySQL生僻字插入失败的处理方法(Incorrect string value)
  6. 解决IDEA本地仓库有jar包却无法引用和打包问题
  7. from flask.ext.cache import make_template_fragment_key
  8. android UI自动化测试工具Robotium VS NativeDriver VS Calabash
  9. 缩减oracle日志,[20180829]减少日志生成量.txt
  10. js中 var a= b || c;
  11. 如何做一个国产数据库(二)
  12. 在ECS系统中使用Entities.ForEach
  13. 设计模式笔记6:工厂方法模式
  14. SoapUI接口测试——添加断言(检查点)——Assertion
  15. 埋藏式心脏复律除颤器的原理及参数设置
  16. 收藏多年的MySQL函数大全笔记,笔记一生一起走,那些日子不再有!
  17. MATLAB 图像处理 将图层随机组合合成图片
  18. 毕业设计 基于大数据住房数据分析与可视化 - python
  19. 【Unity】XPS模型导入Unity(支持VRChat)
  20. MySQL不等于判断时,null空值处理问题

热门文章

  1. odoo15 report 标签弃用
  2. 从我的世界这一款游戏去看存储器
  3. jacob转换office文件
  4. ES修改文档的字段数据类型
  5. 会声会影2023如何添加字幕 会声会影添加字幕后不显示
  6. 如何修改github上的头像
  7. 2008北京奥运会志愿者用语
  8. Apollo Planning学习(9)-------速度规划
  9. 2023广州建博会:鸿雁总裁王米成详解全屋智能的发展脉络
  10. Eclipse汉化教程以及问题解决