Mantengo GPSD, un daemon de servicio open-source ampliamente implementado que monitorea los GPS y otros sensores geodésicos. Escucha conexiones de aplicación de cliente en el puerto 2947 en ambos IPv4 e IPv6. Por razones de seguridad y privacidad, normalmente solo escucha en la dirección de bucle invertido, pero hay una opción -G para el daemon que tiene la intención de hacer que escuche en cualquier dirección.Cómo escuchar en todas las direcciones IPV6 con sockets C API
El problema: la opción -G funciona en IPv4, pero no entiendo cómo hacer que funcione con IPv6. El método que debería funcionar basado en varios ejemplos de tutoriales no lo hace, lo que produce un error que sugiere que la dirección ya está en uso. Estoy buscando ayuda para solucionar esto por parte de personas con experiencia en programación de redes IPv6.
código pertinente se encuentra en http://git.berlios.de/cgi-bin/gitweb.cgi?p=gpsd;a=blob;f=gpsd.c;h=ee2156caf03ca23405f57f3e04e9ef306a75686f;hb=HEAD
Este código funciona correctamente en los casos tanto el -G y no -G menores de IPv4, como se verifica fácilmente con -l netstat.
Ahora mire alrededor de la línea 398 después de "caso AF_INET6:". La opción listen_global está establecida por -G; cuando es falso, el código tiene éxito. Existe actualmente un siguiente comentario, heredado de un colaborador desconocido, que se lee como este:
/* else */
/* BAD: sat.sa_in6.sin6_addr = in6addr_any;
* the simple assignment will not work (except as an initializer)
* because sin6_addr is an array not a simple type
* we could do something like this:
* memcpy(sat.sa_in6.sin6_addr, in6addr_any, sizeof(sin6_addr));
* BUT, all zeros is IPv6 wildcard, and we just zeroed the array
* so really nothing to do here
*/
Según diversos ejemplos del manual He hacia arriba, la asignación "sat.sa_in6.sin6_addr = in6addr_any;" es (a pesar del comentario) correcto y compila. Sin embargo, el inicio con -G falla al afirmar que la dirección de escucha ya está en uso.
es la asignación "sat.sa_in6.sin6_addr = in6addr_any;" nominalmente correcto aquí? ¿Qué más, en todo caso, me estoy perdiendo?
¿Intentaste dar cuerda al daemon? – jpalecek