【问题标题】:How to increment and get the next IPv6 network address from the current network address如何从当前网络地址递增和获取下一个 IPv6 网络地址
【发布时间】:2017-06-05 06:41:56
【问题描述】:

使用标准 python 包,如果我们提供任何 IPv6 网络地址作为输入,我如何获得接下来的几个 IPv6 网络地址。基本上我想遍历给定的网络地址,并且在每次迭代时它应该递增并获得下一个网络

例如,如果我的起始网络地址为 4001:1::/32,那么在每次迭代中,我希望获得下一个网络地址为 4001:2::/32、4001:3::/32、4001 :4::/32 等等。

>>> inet = iterate_on('4001:1::/32')
>>> next(inet)
4001:2::/32
>>> next(inet)
4001:3::/32

注意:这是我之前对fetching IPv4 networks 的问题。

【问题讨论】:

    标签: python networking ipv6


    【解决方案1】:

    ipcalc 有一些例程可以让计算IP 地址变得相当容易。但是如果最好不安装 ipcalc,可以构造一个继承自 ipaddress.IPv6Network 的类。

    代码

    import ipaddress
    
    class BetterIPv6Network(ipaddress.IPv6Network):
    
        def __add__(self, offset):
            """Add numeric offset to the IP."""
            new_base_addr = int(self.network_address) + offset
            return self.__class__((new_base_addr, self.prefixlen))
    
        def size(self):
            """Return network size."""
            return 1 << (self.max_prefixlen - self.prefixlen)
    

    测试代码:

    import itertools as it
    network = BetterIPv6Network(u'4001:1::/32')
    network_addrs = (network + i * network.size() for i in it.count())
    print(next(network_addrs))
    print(next(network_addrs))
    print(next(network_addrs))
    

    结果:

    4001:1::/32
    4001:2::/32
    4001:3::/32
    

    Python 3.4:

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

    import ipaddress
    
    class BetterIPv6Network(ipaddress.IPv6Network):
    
        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).split('/')[1])
    
        def size(self):
            """Return network size."""
            return 1 << (self.max_prefixlen - self.prefixlen)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-12
      • 2014-09-22
      • 2020-11-12
      • 2019-02-03
      相关资源
      最近更新 更多