Почему суффикс% en0 не работает для подключения локального TCP-сокета IPv6 в Python?

Неделю назад кто-то из StackOverflow спросил почему их код Python для подключения к локальному адресу ссылки IPv6 не работал, и я ответил, что, поскольку это был локальный адрес ссылки, им нужно было добавить суффикс% en0 (или любое другое желаемое имя локального интерфейса) на их целевой 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 "", line 1, in 
  File "", line 1, in connect
socket.error: [Errno 65] No route to host

С другой стороны, следующий код ДЕЙСТВИТЕЛЬНО работает (с суффиксом% en0 или без него):

>>> from socket import *
>>> s = socket(AF_INET6, SOCK_STREAM)
>>> s.connect(('fe80::21f:5bff:fe3f:1b36%en0', 2001, 0, 6))
>>> 

... но мне это не нравится таким образом, потому что для того, чтобы выяснить, какое целое число идентификатора области видимости предоставить для последнего аргумента, я должен выполнить кучу не очень переносимого кода для перебора списка локальных интерфейсов, найти интерфейс с именем 'en0' и извлеките его идентификатор области действия, что является более сложной задачей, чем я бы хотел.

Учитывая, что connect () принимает суффикс% en0 для IP-адреса, почему на самом деле он не использует его, как ожидалось, для определения ID области?

FWIW, я тестирую Python 2.6.1 под MacOS / X 10. 6.4.

7
задан Community 23 May 2017 в 12:11
поделиться