标签: scope-id

为什么%en0后缀不能用于连接Python中的链接本地IPv6 TCP套接字?

大约一周前,有人在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进行测试.

python tcp ipv6 link-local scope-id

7
推荐指数
1
解决办法
2971
查看次数

标签 统计

ipv6 ×1

link-local ×1

python ×1

scope-id ×1

tcp ×1