【问题标题】:How to get the next network address given the starting network address in python给定python中的起始网络地址,如何获取下一个网络地址
【发布时间】:2017-02-25 02:11:07
【问题描述】:

python 中有没有办法从给定的起始网络地址获取下一个网络地址。有办法使用ipaddress 模块获取下一个主机IP,但是有没有办法自己获取下一个网络?

例如,如果我的起始网络地址为10.1.0.0/16,那么在每次迭代中,我希望获得下一个网络地址为10.2.0.0/1610.3.0.0/16 等等。

所以在10.1.0.0/16 的情况下,网络部分是前两个八位字节(10.1),其余的是主机部分。我希望网络部分在每次迭代时单独增加,而主机部分保持原样,例如:

start_network = ipaddress.ip_network('10.1.0.0/16')

# Now on each iteration I want the below output

In [37]: next(start_network)
Out[37]: IPv4Network('10.2.0.0/16')
In [38]: next(start_network)
Out[38]: IPv4Network('10.3.0.0/16')

尝试使用子网选项,但顾名思义,它将为您提供当前网络中的子网络

In [34]: network = ipaddress.ip_network('10.1.0.0/16')

In [35]: network.subnets()

但我们的要求是获取下一个网络地址(最好不进行任何字符串操作)

【问题讨论】:

  • 我已在此处发布了针对您的具体问题的解决方案:stackoverflow.com/a/42451377/7311767
  • 但是你的答案是要获取下一个主机IP,而我的问题是获取下一个网络地址
  • 什么是下一个网络地址?如果我的回答还不够,建议使用示例来编辑您的问题,以显示您的期望。
  • 使用您建议的第一次迭代代码,我将获得的值为 10.1.0.1(第一个主机 IP),我需要网络 ip,即 10.2.0.0/16
  • 好的,那么问题被错误地关闭了。你有一个不同的问题。请编辑问题并说明您的需求。

标签: python networking


【解决方案1】:

ipcalc 有一些例程可以让计算IP 地址变得相当容易。例如,获取下一个网络范围地址的迭代器可以这样完成:

代码:

import ipcalc
import itertools as it

network = ipcalc.Network('10.1.0.0/16')
network_addrs = (network + (i + 1) * network.size() for i in it.count())

测试代码:

print(next(network_addrs))
print(next(network_addrs))
print(next(network_addrs))

结果:

10.2.0.0/16
10.3.0.0/16
10.4.0.0/16

仅限标准库:

如果最好不要安装ipcalc,可以构造一个继承自ipaddress.IPv4Network的类。

import ipaddress

class BetterIPv4Network(ipaddress.IPv4Network):

    def __add__(self, offset):
        """Add numeric offset to the IP."""
        new_base_addr = int(self.network_address) + offset
        return self.__class__((new_base_addr, str(self.netmask)))

    def size(self):
        """Return network size."""
        start = int(self.network_address)
        return int(self.broadcast_address) + 1 - start

用法:

import itertools as it

network = BetterIPv4Network(u'10.1.0.0/16')
network_addrs = (network + (i + 1) * network.size() for i in it.count())

Python 3.4:

Python 3.4 不接受元组来初始化 ipaddress.IPv4Network。这段代码可以解决这个问题。

class BetterIPv4Network(ipaddress.IPv4Network):

    def __add__(self, offset):
        """Add numeric offset to the IP."""
        new_base_addr = int(self.network_address) + offset
        new_base_addr_str = str(self.__class__(new_base_addr)).split('/')[0]
        return self.__class__(new_base_addr_str + '/' + str(self.netmask))

    def size(self):
        """Return network size."""
        start = int(self.network_address)
        return int(self.broadcast_address) + 1 - start

【讨论】:

  • 这也可以使用标准的python3模块(ipaddress)来实现吗?
  • 是的,有可能。
  • 此解决方案是否依赖于 python 版本?我看到 python 3.4.1 的一个问题。有解决办法吗?错误:AddressValueError:“(167903232,'255.255.0.0')”中的“(167903232,'255”)中只允许十进制数字
  • 好的。添加了 Python 3.4 支持。
  • 这个逻辑是否也适用于 IPv6 地址?
猜你喜欢
  • 1970-01-01
  • 2012-07-12
  • 2011-11-09
  • 1970-01-01
  • 2018-02-12
  • 1970-01-01
  • 1970-01-01
  • 2013-05-28
  • 1970-01-01
相关资源
最近更新 更多