使用 ipaddress 模块判断给定 IPv4 地址是否为保留地址的 Python 程序
在传统的 IPv4 地址方案中,IP 地址被分为五类:A、B、C、D 和 E。E 类地址,范围从 240.0.0.0 到 255.255.255.255,被指定用于特定目的,并且不打算在当前的互联网基础设施中用于一般用途。因此,E 类地址被认为是“保留”的,并且不会在公共互联网上分配或路由。
为了确定给定的 IPv4 地址是否属于由互联网工程任务组 (IETF) 和互联网号码分配机构 (IANA) 等组织定义的保留 IP 地址范围之一,Python 利用了 ipaddress 模块提供的 IPv4Address 对象的 is_reserved 属性。通过检查此属性,我们可以准确地识别给定地址是否为保留地址。
输入输出场景
让我们看看一些使用 ipaddress 模块确定给定 IPv4 地址是否为保留地址的 Python 程序的输入输出场景。
场景 1 -
Input: "192.168.0.1" Output: The address 192.168.0.1 is not reserved.
场景 2 -
Input: "10.0.0.1" Output: The address 10.0.0.1 is reserved.
场景 3 -
Input: "172.16.0.1" Output: The address 172.16.0.1 is not reserved.
场景 4 -
Input: "240.10.0.1" Output: The address 240.10.0.1 is reserved.
方法
我们可以按照以下步骤使用 Python 中的 ipaddress 模块确定给定的 IPv4 地址是否为保留地址。
导入 ipaddress 模块。
定义一个包含一些示例 IPv4 地址的列表。
遍历列表中的每个 IPv4 地址,并使用 ip_address() 方法创建一个 IPv4Address 对象。
最后,使用 IPv4Address 对象的 is_reserved 属性来确定地址是否为保留地址。
ipaddress.ip_address() 方法
它用于创建一个表示 IP 地址的 IPv4Address 或 IPv6Address 对象。该方法返回一个 IPv4Address 或 IPv6Address 对象,具体取决于提供的地址类型。如果输入地址无效,例如格式不正确或值超出范围,则会引发 ValueError。以下是 ip_address() 方法的语法
ipaddress.ip_address(address)
其中,address 参数是要创建对象的 IP 地址的字符串表示形式。
is_reserved 属性
它是 ipaddress 模块中 IPv4Address 对象的一个属性。它用于根据 IETF 和 IANA 等各种组织定义的保留 IP 地址范围来确定 IP 地址是否为保留地址。
如果 IP 地址为保留地址,则返回 True。否则,返回 False。
示例
让我们举一个例子,看看如何使用 Python 中的 ipaddress 模块确定给定的 IPv4 地址是否为保留地址。
import ipaddress # define a list of ipv4 addresses ipv4_addresses = [ "240.10.0.1", "10.0.0.1", "172.16.0.1", "192.168.0.1", "241.0.0.133", ] # Check if each IPv4 address is reserved or not for address in ipv4_addresses: ip = ipaddress.ip_address(address) if ip.is_reserved: print("The address {} is reserved.".format(address)) else: print("The address {} is not reserved.".format(address))
输出
The address 240.10.0.1 is reserved. The address 10.0.0.1 is not reserved. The address 172.16.0.1 is not reserved. The address 192.168.0.1 is not reserved. The address 241.0.0.133 is reserved.
示例
在此示例中,我们将使用 try-except 块来处理任何无效的地址输入。
import ipaddress # define a list of ipv4 addresses ipv4_addresses = [ "240.10.0.1", "10.0.0.1", "172.16.0.1", "192.168.0.1", "241.0.0.133", "0.3.12" ] # Check if each IPv4 address is reserved or not for address in ipv4_addresses: try: ip = ipaddress.ip_address(address) if ip.is_reserved: print("The address {} is reserved.".format(address)) else: print("The address {} is not reserved.".format(address)) except ValueError: print("The address {} is not a valid IPv4 address.".format(address))
输出
The address 240.10.0.1 is reserved. The address 10.0.0.1 is not reserved. The address 172.16.0.1 is not reserved. The address 192.168.0.1 is not reserved. The address 241.0.0.133 is reserved. The address 0.3.12 is not a valid IPv4 address.