gpt4 book ai didi

dart - 如何检查 2 个 IP 是否属于 Dart 中的同一网络?

转载 作者:IT王子 更新时间:2023-10-29 06:46:28 26 4
gpt4 key购买 nike

我在 Flutter 中有一个应用需要检查 2 个不同的 IP(例如 170.16.1.1 和 170.16.1.2),并想检查它们是否属于同一个网络。我想我还需要网络掩码,对吗?

Dart语言如何实现?

最佳答案

我认为这段代码可能适用于 IPv4:


void main() {
print('192.168.0.1 is ${checkSameSubnet('192.168.0.1','192.168.9.2', 12)?' ':'NOT'} in the same /12 subnet as 192.168.9.2');
print('192.168.0.1 is ${checkSameSubnet('192.168.0.1','192.168.9.2', 24)?' ':'NOT'} in the same /24 subnet as 192.168.9.2');
}
bool checkSameSubnet(String ip1, String ip2, int netmask){
String ipv4Pattern =
r"^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$"; // https://stackoverflow.com/a/36760050/4062341
assert(RegExp(ipv4Pattern).hasMatch(ip1),'ip1 must be a valid IPv4 address');
assert(RegExp(ipv4Pattern).hasMatch(ip2),'ip2 must be a valid IPv4 address');

// print(Uri.parseIPv4Address(ip1)); // [192, 168, 0, 1]
// print(Uri.parseIPv4Address(ip1)
// .map((e) => e.toRadixString(2))); // ('11000000', '10101000', '0', '1')
// print(Uri.parseIPv4Address(ip1)
// .map((e) => e.toRadixString(2).padLeft(8, '0'))); // ('11000000', '10101000', '00000000', '00000001') fill them up with leading 0s
// print(Uri.parseIPv4Address(ip1).fold(
// '', (prev, e) => '$prev${e.toRadixString(2).padLeft(8, '0')}')); // 11000000101010000000000000000001 merge them all



String firstIp = Uri.parseIPv4Address(ip1).fold(
'', (prev, e) => '$prev${e.toRadixString(2).padLeft(8, '0')}');

String secondIp = Uri.parseIPv4Address(ip2).fold(
'', (prev, e) => '$prev${e.toRadixString(2).padLeft(8, '0')}');
// check match length of the subnet mask
return firstIp.substring(0,netmask) == secondIp.substring(0,netmask);

}

首先,我使用 assert() 确保两个 IP 确实是 Ipv4 格式。对于 IPv6,您需要不同的正则表达式模式。

然后使用 Uri.parseIPv4Address() 将它们转换为 [int]。

现在我将它们分别转换为二进制表示法并添加隐式前导零以使它们全部达到 8 位长度。

return 语句中,我检查两个经过处理的 IP 是否与网络掩码长度匹配。

这适用于专用网络(10.0.0.0/8172.16.0.0/12192.168.0.0/16)。

关于dart - 如何检查 2 个 IP 是否属于 Dart 中的同一网络?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54652363/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com