python ipaddress.IPv6Address 实例中的范围 ID
Scope ID in python ipaddress.IPv6Address instances
我目前正在为通过 IPv6 link-本地地址进行网络通信的 C++ 库编写 python 包装器。要初始化库,必须选择网络接口。这是通过所需接口的 link-本地地址完成的。
在 C++ 方面,我们使用 boost address_v6 objects. On the python side the ipaddress.IPv6Address 似乎是绝配。
但是我没有找到在 python 端指定接口范围 ID 的方法。
ip = ipaddress.IPv6Address('fe80::3c4e:6a7:3f57:4cbc%12')
给出错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python34\lib\ipaddress.py", line 1835, in __init__
self._ip = self._ip_int_from_string(addr_str)
File "C:\Python34\lib\ipaddress.py", line 1664, in _ip_int_from_string
raise AddressValueError("%s in %r" % (exc, ip_str)) from None
ipaddress.AddressValueError: Only hex digits permitted in '4cbc%12' in 'fe80::3c4e:6a7:3f57:4cbc%12'
IPv6 link-如果没有范围 ID,本地通信几乎是不可能的。
我是不是遗漏了什么,或者是将 IPv6 link-本地接口地址指定为字符串的最佳方式吗?
我建议在所有有意义的情况下使用与 Python 套接字模块相同的结构。即使使用本机库意味着不会使用 Python 套接字模块,如果某些数据结构在两者之间兼容,它仍然是有益的。
为了表示 IP 地址,Python 套接字模块确实使用了字符串。该字符串可以在适当的时候包含范围 ID。
Python 套接字模块也需要表示套接字地址,为此它使用由四个字段组成的元组。例如:
('ff02::2%eth0', 80, 0, 2)
请注意,此表示有点多余,因为范围 ID 在 IP 地址内指定为 %eth0
和 2
(元组的最后一个元素)。
((*_, sockaddr),) = socket.getaddrinfo(
'ff02::1de:c0:face:8D%42',
1234,
socket.AF_INET6,
socket.SOCK_DGRAM,
socket.IPPROTO_UDP
)
assert sockaddr == ('ff02::1de:c0:face:8d', 1234, 0, 42)
我目前正在为通过 IPv6 link-本地地址进行网络通信的 C++ 库编写 python 包装器。要初始化库,必须选择网络接口。这是通过所需接口的 link-本地地址完成的。
在 C++ 方面,我们使用 boost address_v6 objects. On the python side the ipaddress.IPv6Address 似乎是绝配。
但是我没有找到在 python 端指定接口范围 ID 的方法。
ip = ipaddress.IPv6Address('fe80::3c4e:6a7:3f57:4cbc%12')
给出错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python34\lib\ipaddress.py", line 1835, in __init__
self._ip = self._ip_int_from_string(addr_str)
File "C:\Python34\lib\ipaddress.py", line 1664, in _ip_int_from_string
raise AddressValueError("%s in %r" % (exc, ip_str)) from None
ipaddress.AddressValueError: Only hex digits permitted in '4cbc%12' in 'fe80::3c4e:6a7:3f57:4cbc%12'
IPv6 link-如果没有范围 ID,本地通信几乎是不可能的。
我是不是遗漏了什么,或者是将 IPv6 link-本地接口地址指定为字符串的最佳方式吗?
我建议在所有有意义的情况下使用与 Python 套接字模块相同的结构。即使使用本机库意味着不会使用 Python 套接字模块,如果某些数据结构在两者之间兼容,它仍然是有益的。
为了表示 IP 地址,Python 套接字模块确实使用了字符串。该字符串可以在适当的时候包含范围 ID。
Python 套接字模块也需要表示套接字地址,为此它使用由四个字段组成的元组。例如:
('ff02::2%eth0', 80, 0, 2)
请注意,此表示有点多余,因为范围 ID 在 IP 地址内指定为 %eth0
和 2
(元组的最后一个元素)。
((*_, sockaddr),) = socket.getaddrinfo(
'ff02::1de:c0:face:8D%42',
1234,
socket.AF_INET6,
socket.SOCK_DGRAM,
socket.IPPROTO_UDP
)
assert sockaddr == ('ff02::1de:c0:face:8d', 1234, 0, 42)