文章目录

  • 目的
  • 计算方法
  • 示例代码
  • 代码演示
  • 总结

目的

UDP广播是比较常用的一种功能,应用方面来说经常用在设备发现等功能中。UDP广播需要知道广播地址,这篇文章将介绍通过IPv4地址和子网掩码来计算广播地址。

IPv6是没有广播的。想想看IPv6中一个网段内这么多节点广播就是灾难。

计算方法

广播地址计算方法如下:
广播地址 = IP地址 按位或 ( 按位取反 ( 子网掩码 ) )

下面是一组数据可以用来计算验证:

原始表达 二进制表达
IP地址 172.16.1.115 10101100.00010000.00000001.01110011
子网掩码 255.255.252.0 11111111.11111111.11111100.00000000
子网掩码按位取反 00000000.00000000.00000011.11111111
广播地址 172.16.3.255 10101100.00010000.00000011.11111111

有一种说法是使用 255.255.255.255 作为广播地址,但这是不正确的。如果设备上有多个网络接口,接入了多个网络的话使用这个地址广播结果可能就会不符合预期了。正确的做法是对接入的各个网络单独计算其广播地址。

示例代码

下面代码可以用来获取计算电脑上所有IPv4类型的网络接口的广播地址:

const os = require('os');function getBroadcastAddress() {const broadcastAddress = new Set(); // 使用Set来保存广播地址可以自动去重// 获取网络接口信息// 返回结果结构:{a:[{ ... }, ...], b:[{ ... }, ...], ...}let interfaces = os.networkInterfaces();// 遍历获取需要的网络接口信息for (const key in interfaces) {for (const interface of interfaces[key]) {// 该接口是IPv4,且不是内部回环地址(对于IPv4而言回环地址为127.0.0.1)if (interface.family === 'IPv4' && !interface.internal && interface.address !== '127.0.0.1') {// 将IP地址和子网掩码各自切成四个字段,方便下面计算广播地址let slices = [interface.address.split('.'), interface.netmask.split('.')];let fields = []; for (let i = 0; i < 4; i++) {// 广播地址 = IP | (~MASK)fields[i] = String(Number(slices[0][i]) | ((~Number(slices[1][i])) & 0xff));}// 拼合广播地址为字符串形式并存入SetbroadcastAddress.add(`${fields[0]}.${fields[1]}.${fields[2]}.${fields[3]}`);}}}return broadcastAddress;
}

代码演示

因为工作原因我的电脑上有非常多的实体的或是虚拟的网卡,下面是我电脑上部分网络情况:


下面使用代码来计算获取广播地址:

计算得到广播地址分别为 192.168.56.255 172.27.255.255 192.168.31.255

总结

UDP IPv4广播地址计算并不复杂,只要拿到IP地址和子网掩码就行,一般这两个都是比较好获取的。

UDP IPv4广播地址计算(附Node.js示例代码)相关推荐

  1. WebStorm 打开Node.js的代码提示功能

    Node.js coding assistance is disabled,Suggests configuring coding assistance for Node.js core module ...

  2. RabbitMQ Node.js 示例

    RabbitQM 处理和管理消息队列的中间人(broker).可简单理解为邮局,你在程序中写好消息,指定好收件人,剩下的事件就是 RabbitMQ 的工作了,它会保证收件人正确收到邮件. 任何发送邮件 ...

  3. 使用 husky 和 lint-staged 检查 Node.js 的代码一致性

    在软件开发过程中,代码风格检查(Code Linting)是保障代码规范和一致性的有效手段.过去,Lint 的工作一般在 Code Review 或者 CI 的时候进行,但这样会导致问题的反馈链,浪费 ...

  4. node.js 后台代码怎么部署到服务器上?

    服务器先安装node 安装node,进入到想要把node下载到的那个文件夹下.本文是/usr/local cd /usr/local wget https://nodejs.org/dist/v8.9 ...

  5. c语言触屏滑动图片,微信小程序左右滑动切换图片酷炫效果(附效果)(示例代码)...

    开门见山,先上效果吧!感觉可以的用的上的再往下看. 心动吗?那就继续往下看! 先上页面结构吧,也就是wxml文件,其实可以理解成微信自己封装过的html,这个不多说了,不懂也没必要往下看了. 1 2 ...

  6. JDY-40无线模块的使用(透传、参数设置) 附Arduino 简单示例代码

    目录 1.如何与单片机(串口模块)连接? 2.如何在USB转串口模块调试? 3.如何用Arduino 对JDY-40设置参数(其他单片机也可参考,需要自己写代码)? 4.两个模块之间如何通信(透传)? ...

  7. Apache Ignite的Node.js客户端使用入门

    为什么80%的码农都做不了架构师?>>>    介绍 Ignite原生提供了若干种主要编程语言的支持,最近,还通过瘦客户端技术对其它的编程语言提供了支持,其中在2.7版本中新增加的瘦 ...

  8. 2019 年,19 种方法让自己成为更好的 Node.js 工程师

    原文作者:Yoni Goldberg 译者:UC 国际研发 Jothy 写在最前:欢迎你来到"UC国际技术"公众号,我们将为大家提供与客户端.服务端.算法.测试.数据.前端等相关的 ...

  9. 什么是node网站服务器,node.js

    Node.js发布于2009年5月,由Ryan Dahl开发,是一个基于Chrome V8引擎的JavaScript运行环境,使用了一个事件驱动.非阻塞式I/O模型,[1] 让JavaScript 运 ...

最新文章

  1. Android4.2以及最新SDK的尝鲜使用
  2. 向Window窗体发送消息,控制程序的运行.
  3. php 字符串与数字相加,注意!PHP中字符串与数字的比较
  4. Angular相关的有价值的问题集锦
  5. java inireader_java读取配置文件 Java中如何设置读取ini配置文件?
  6. laravel框架之自帶登錄註冊
  7. matlab实时系统时间,转--MATLAB——时间,日期及显示格式
  8. 001-为什么Java能这么流行
  9. python字典操作首字母与星期的对应_python小课堂10 - 基本数据类型终篇集合和字典...
  10. IE Cookie 文件格式
  11. 程序员的自我修养 - 符号修饰 函数签名 以及一个引申的问题: extern c
  12. 并发(二)——linux内核同步机制分析
  13. 马哥 python培训
  14. 开源可视化bi工具有哪些,干货推荐
  15. vue中的横向排列_vue + ElementUI 的横向表格代码
  16. Android应用获取设备序列号
  17. DOSBOX + MASM
  18. cmd中的循环语句for
  19. docker对已经启动的容器添加目录映射(挂载目录)
  20. 2D流体火焰,低精度测试。

热门文章

  1. Linux上基于 Golang 实现 KeyLogger 按键记录
  2. solidworks安装教程2021
  3. VC++多线程全面讲解
  4. YOLOv5的Tricks | 【Trick7】指数移动平均(Exponential Moving Average,EMA)
  5. 主域名和子域名简单易懂详细讲解
  6. 基于多特征时空图卷积网络的水运通航密度预测
  7. android不设密码装证书,安卓4.0不设置锁屏安装根证书教程
  8. FALSE/TRUE与false/true的区别
  9. O365用户发送邮件收到退信,故障码是:550 5.7.1 解决办法
  10. 手机投屏软件直播监控软件可以互联网远程控制