如何从当前网络地址

时间:2017-06-05 06:41:57

标签: python networking ipv6

使用标准的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的问题。

1 个答案:

答案 0 :(得分:2)

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不接受init 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)