【发布时间】:2015-01-19 16:01:41
【问题描述】:
很简单,我想将给定的 IP 地址拆分为 netid(由网络掩码定义)和 Perl 中的 hostid。示例:
$network = NetAddr::IP->new('192.168.255.255/29') || die "invalid space $_";
现在$network->mask 返回255.255.255.248。但是NetAddr::IP 中没有任何方法可以应用掩码将地址拆分为/29 空间中的netid 和hostid 部分。
NetAddr::IP::Util 提到运营商这样做,但它的文档是一团糟。
至少可以使用Net::NetMask提取netid:
$netid = Net::Netmask->new('192.168.255.255/29')->base;
这会产生192.168.255.248。同样,没有办法获得主机部分0.0.0.7。也许最好的办法是将 IP 打包/解包为 32 位 int,然后简单地 & 将它们取出。然后打印 IP 地址的二进制表示也会更容易,我发现这对于调试和文档目的非常有帮助。
【问题讨论】:
-
为什么要
0.0.0.7?听起来像是 XY 问题 -
不是。提取 hostid 的方法完全丢失了,并且可能在 Perl 的其他地方可用。
NetAddr::IP::Util看起来很有希望,但不知道如何使用它。 -
这不能回答我的问题。
-
...因为 192.168.255.255/29 的网络 ID(也称为子网掩码)是 255.255.255.248,主机 ID 是 0.0.0.7。对于 127.0.0.1/8,网络 ID 为 255.0.0.0,主机 ID 为 0.0.0.1。换句话说,hostid 是应用子网掩码时 IP 地址的剩余部分。如何在 Perl 中获取它?
-
我知道你想要什么。我问为什么。
标签: perl networking ip subnet netmask