【问题标题】:Perl: Split IP address into hostid and netidPerl:将IP地址拆分为hostid和netid
【发布时间】: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


【解决方案1】:

使用 hostmask() 方法

$host_wildcard = Net::Netmask->new('192.168.255.255/29')->hostmask;

【讨论】:

  • 我不这么认为。 hostmask 返回掩码,而不是值。在我的示例中,它们恰好是相同的(0.0.0.7),但是,如果是 192.168.255.254 等,则不是。也许我的示例 IP 有点误导。很抱歉。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多