Gestisco GPSD, un demone di servizio open source ampiamente distribuito che monitora i GPS e altri sensori geodetici. Ascolta le connessioni client-applicazione sulla porta 2947 su IPv4 e IPv6. Per motivi di sicurezza e privacy, normalmente è in ascolto solo sull'indirizzo di loopback, ma esiste un'opzione -G per il daemon che deve essere ascoltato su qualsiasi indirizzo.Come ascoltare su tutti gli indirizzi IPV6 usando l'API C socket
Il problema: l'opzione -G funziona in IPv4, ma non riesco a capire come farlo funzionare con IPv6. Il metodo che dovrebbe funzionare in base a vari esempi di tutorial non lo fa, producendo invece un errore che suggerisce che l'indirizzo è già in uso. Sto cercando aiuto per risolvere questo problema da persone con esperienza con la programmazione di rete IPv6.
codice pertinente è in http://git.berlios.de/cgi-bin/gitweb.cgi?p=gpsd;a=blob;f=gpsd.c;h=ee2156caf03ca23405f57f3e04e9ef306a75686f;hb=HEAD
Questo codice funziona correttamente in casi sia il -G e non -G sotto IPv4, come facilmente si verifica con -l netstat.
Ora osservare intorno alla riga 398 dopo "caso AF_INET6:". L'opzione listen_global è impostata da -G; quando è falso, il codice ha successo. Non v'è attualmente seguita da un commento, ereditato da un contributore sconosciuta, che si legge come questo:
/* 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
*/
Secondo vari esempi del tutorial che ho guardato in su, l'assegnazione "sat.sa_in6.sin6_addr = in6addr_any;" è (nonostante il commento) corretto, e lo fa compilare. Tuttavia, l'avvio con -G non riesce a sostenere che l'indirizzo di ascolto è già in uso.
È l'assegnazione "sat.sa_in6.sin6_addr = in6addr_any;" nominalmente corretto qui? Cos'altro, se non altro, mi sto perdendo?
Hai provato a camminare sul demone? – jpalecek