繁体   English   中英

给定Python中的起始网络地址,如何获取下一个网络地址

[英]How to get the next network address given the starting network address in python

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()

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM