Je gère GPSD, un démon de service open-source largement déployé qui surveille les GPS et autres capteurs géodésiques. Il écoute les connexions client-application sur le port 2947 sur IPv4 et IPv6. Pour la sécurité et la confidentialité, il n'écoute normalement que sur l'adresse de bouclage, mais il existe une option -G pour le démon qui doit l'écouter sur n'importe quelle adresse. Le problème: l'option -G fonctionne en IPv4, mais je n'arrive pas à comprendre comment le faire fonctionner avec IPv6. La méthode qui devrait fonctionner sur la base de divers exemples de tutoriel ne produit pas, produisant plutôt une erreur suggérant que l'adresse est déjà utilisée. Je cherche de l'aide pour résoudre ce problème auprès des personnes expérimentées en programmation réseau IPv6.Comment écouter sur toutes les adresses IPV6 utilisant des sockets C API
Code pertinente est http://git.berlios.de/cgi-bin/gitweb.cgi?p=gpsd;a=blob;f=gpsd.c;h=ee2156caf03ca23405f57f3e04e9ef306a75686f;hb=HEAD
Ce code fonctionne correctement dans les deux cas -G et non -G sous IPv4, comme il est difficile à cerner avec netstat -l.
Regardez maintenant autour de la ligne 398 après "cas AF_INET6:". L'option listen_global est définie par -G; quand faux, le code réussit. Il y a actuellement un commentaire ci-dessous, héritée d'un contributeur inconnu, qui se lit comme ceci:
/* 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
*/
Selon divers exemples tutoriel, j'ai levé les yeux, l'affectation « sat.sa_in6.sin6_addr = in6addr_any; » est (malgré le commentaire) correct, et il compile. Cependant, le démarrage avec -G échoue en déclarant que l'adresse d'écoute est déjà utilisée.
L'affectation "sat.sa_in6.sin6_addr = in6addr_any;" nominalement correct ici? Quoi d'autre, s'il y a quelque chose, est-ce que je manque?
Avez-vous essayé de mettre le démon en place? – jpalecek