with socket real example español create python tcp ipv6 link-local scope-id

real - ¿Por qué no funciona un sufijo% en0 para conectar un socket TCP-local IPv6 TCP en Python?



socket python 3 (1)

Esta es la forma correcta de hacer una conexión ipv6:

>>> addrinfo = getaddrinfo(''fe80::225:ff:fecd:5aa0%en0'', 2001, AF_INET6, SOCK_STREAM) >>> addrinfo [(30, 1, 6, '''', (''fe80::225:ff:fecd:5aa0%en0'', 2001, 0, 4))] >>> (family, socktype, proto, canonname, sockaddr) = addrinfo[0] >>> s = socket(family, socktype, proto) >>> s.connect(sockaddr)

getaddrinfo() devolverá el alcance numérico correcto y la información de flujo para usted.

Hace aproximadamente una semana, alguien en StackOverflow me preguntó por qué su código Python para conectarse a una dirección local de enlace IPv6 no funcionaba y respondí que, dado que era una dirección local de enlace, necesitaban agregar un% en0 (o lo que sea). el sufijo de interfaz local deseado es) a su dirección IP de destino. Pensé que sabía de lo que estaba hablando, así que en realidad no probé mi sugerencia antes de responder (¡qué vergüenza!).

Hoy fui a usar la misma técnica para mí, solo para descubrir que no parece funcionar. : ^ (Es decir, este código no funciona:

>>> 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

El siguiente código, por otro lado, funciona (con o sin el sufijo% en0):

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

... pero no me gusta hacerlo de esa forma, porque para averiguar qué ID de alcance suministrar para el último argumento, tengo que ejecutar un montón de código no muy portátil para iterar sobre las interfaces locales Haga una lista, busque la interfaz llamada ''en0'' y extraiga su ID de ámbito, que es más sobrecarga de complejidad de lo que me gustaría tener.

Dado que connect () está aceptando el sufijo% en0 en la dirección IP, ¿por qué no lo está usando como se esperaba para determinar la ID del alcance?

FWIW, estoy probando con Python 2.6.1 bajo MacOS / X 10.6.4.