2010-03-17 17 views

Respuesta

10

La dirección IPv6 link-local no es única en el nodo, es única para el NIC, por lo que debe especificar el scope-id. En otras palabras, es perfectamente válido tener múltiples adaptadores con exactamente la misma dirección IPv6.

Esto significa que debe tomar como entrada el identificador de alcance o el formulario de texto adecuado (% eth0,% 1) que puede pasar a getaddrinfo().

Un método es tomar una dirección IPv6 link-local, enumerar las interfaces y si solo hay una coincidencia usar eso, si hay más de una coincidencia, rescatar con una lista de interfaces y hacer que el usuario especifique cuál forma completa.

+0

La dirección local de enlace se forma a partir de su prefijo de enrutamiento y la dirección MAC de la interfaz. Entonces, si hay varios adaptadores disponibles en el mismo host, cada adaptador de red tiene una dirección de enlace local diferente. – zeekvfu

+1

@Zind está asumiendo incorrectamente que cada interfaz tiene una dirección MAC única. Vea el hardware de Sun para un contraejemplo. –

3

El problema solo surge cuando codifica una dirección local de enlace, que no es realmente una solución práctica para una aplicación no trivial.

De lo contrario, que debería estar recibiendo su sockaddr de obligar a getifaddrs(), que llene el ID de ámbito para usted (por ejemplo. Puede permitir que su usuario especificar un nombre de interfaz, a continuación, buscar a través de la lista devuelta por getifaddrs() encontrar la dirección local de enlace asociada con esa interfaz).

3

para IPv6 las direcciones locales de vínculo (fe80::/10 prefijo), el miembro de sin6_scope_id en la estructura es el número de interfaz y se puede obtener este número por

if_nametoindex(const char *ifname); 
Cuestiones relacionadas