python - 如何从当前网络地址递增并获取下一个 IPv6 网络地址

标签 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 提出的问题.

最佳答案

图书馆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)

关于python - 如何从当前网络地址递增并获取下一个 IPv6 网络地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44363103/

相关文章:

c++ - 当禁用路由器上的 DHCP 时,以太网模块 ENC28C60 无法连接到互联网

networking - 我可以在 SRV 记录中使用 IP 地址吗?

c - 打印网络掩码

python - 如何使用 Python/Pandas 转换为正态分布?

python - 从命令行创建项目

python - 在功能上,torch.multinomial 与 torch.distributions.categorical.Categorical 相同吗?

python - Pandas 与 json 之间的时间戳

windows - 如何列出远程机器文件夹的内容

linux - 无法创建 netlink 套接字 : Protocol not supported

linux - 来自 struct inet_sock 的可打印 IPv6 地址和端口