Esta pregunta se puede tratar como una pregunta hermana de previous one publicado por mí mismo. Es muy tedioso que cuando quiera vincular una dirección local de enlace a un socket IPv6, necesite establecer el campo sin6_scope_id
de la estructura . Me pregunto si alguien puede brindar una solución siguiendo buenas prácticas.cómo vincular una dirección local de enlace a un socket ipv6
Respuesta
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.
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).
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);
- 1. Formato de dirección local de enlace IPv6
- 2. Por qué no puedo enlazar socket IPv6 a una dirección de enlace local
- 3. Agregando dirección local de enlace
- 4. ¿Por qué vincular un socket a una dirección?
- 5. Enlazar la dirección IPv6 al socket Python como dirección IP de origen
- 6. Cómo vincular un socket a múltiples interfaces
- 7. Cómo obtener la dirección IPv6 de una interfaz en Linux
- 8. Cómo convertir una dirección de IPv4 a IPv6
- 9. ¿Cómo vincular un Socket Raw a un puerto específico?
- 10. ¿Cómo puedo convertir la dirección IPV6 a la dirección IPV4?
- 11. Enlazar un socket de servidor IPv6 en Windows
- 12. Vincular a una DLL de dirección grande
- 13. ¿Por qué no funciona un sufijo% en0 para conectar un socket TCP-local IPv6 TCP en Python?
- 14. cómo vincular el socket sin procesar a una interfaz específica
- 15. Obtener una dirección MAC remota a través de IPv6
- 16. Cómo obtener su propia dirección IP (local) desde un socket udp (C/C++)
- 17. ¿Cómo obtener la dirección IPv6 en C#?
- 18. IPs locales y globales de enlace en las interfaces IPv6
- 19. Guía definitiva para comprender cómo formular una dirección IPv6
- 20. WPF Enlace a la variable local
- 21. Longitud máxima de la representación textual de una dirección IPv6?
- 22. Calculando todas las direcciones dentro de una subred ... para IPv6
- 23. Identificación de la dirección de origen de IPv6 preferida para un adaptador
- 24. Coincidencia de la dirección IPv6 con una subred CIDR
- 25. connect() devuelve "argumento inválido" con la dirección ipv6
- 26. Es la dirección IP en la misma subred que la máquina local (con soporte IPv6)
- 27. Cómo leer el indicador TENTATIVO de la dirección IPv6?
- 28. expandir una dirección IPv6 para que pueda imprimirlo en stdout
- 29. ¿Cómo configurar un socket Winsock UDP?
- 30. Android e IPv6 en Java
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
@Zind está asumiendo incorrectamente que cada interfaz tiene una dirección MAC única. Vea el hardware de Sun para un contraejemplo. –