UDP IPv4广播地址计算(附Node.js示例代码)
Posted Naisu Xu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UDP IPv4广播地址计算(附Node.js示例代码)相关的知识,希望对你有一定的参考价值。
文章目录
目的
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));
// 拼合广播地址为字符串形式并存入Set
broadcastAddress.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示例代码)的主要内容,如果未能解决你的问题,请参考以下文章