大约一周前,有人在StackOverflow上询问为什么他们用于连接到IPv6链接本地地址的Python代码无效,我回答说,因为它是一个链接本地地址,所以需要添加%en0(或者其他任何所需的local-interface-name是其目标IP地址的后缀.我以为我知道我在说什么,所以在回答之前我没有真正测试过我的建议(对我感到羞耻!).
今天我为自己使用了同样的技术,却发现它似乎不起作用.:^(也就是说,此代码不起作用:
>>> from socket import *
>>> s = socket(AF_INET6, SOCK_STREAM)
>>> s.connect(('fe80::21f:5bff:fe3f:1b36%en0', 2001))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1, in connect
socket.error: [Errno 65] No route to host
Run Code Online (Sandbox Code Playgroud)
另一方面,以下代码可以工作(带或不带%en0后缀):
>>> from socket import *
>>> s = socket(AF_INET6, SOCK_STREAM)
>>> s.connect(('fe80::21f:5bff:fe3f:1b36%en0', 2001, 0, 6))
>>>
Run Code Online (Sandbox Code Playgroud)
...但我不喜欢这样做,因为为了弄清楚要为最后一个参数提供哪个范围ID整数,我必须执行一堆不可移植的代码来迭代本地接口list,找到名为'en0'的接口,并提取其范围ID,这比我想要的更复杂.
鉴于connect()正在接受IP地址的%en0后缀,为什么不按预期使用它来确定范围ID?
FWIW,我正在使用MacOS/X 10.6.4下的Python 2.6.1进行测试.