Non è possibile ascoltare su 2 indirizzi IP diversi con 1 socket TCP, tuttavia se si ascoltano tutte le interfacce utilizzando l'indirizzo in6addr_any, che includerà anche tutti gli indirizzi IPv4 (anche se, ad esempio, Linux ha un'opzione del kernel per disabilitare quella mappatura).
L'API socket (versione più recente) è abbastanza trasparente per l'utilizzo di IPv4 o IPv6, ma è necessario prestare particolare attenzione a come un'applicazione IPv4 viene codificata in genere.
ad es. questo codice IPv4 che accetta una connessione e stampa l'indirizzo dell'host remoto:
struct sockaddr_in client_addr;
socklen_t addr_len = sizeof(client_addr);
client_data->fd = accept(server_fd,(struct sockaddr*)&client_addr,&addr_len);
log_printf("New client from %s\n",inet_ntoa(client_addr.sin_addr.s_addr));
dovrebbero essere convertiti a quanto segue, che gestisce sia IPv4 che IPv6
struct sockaddr_storage client_addr;
char numeric_addr[INET6_ADDRSTRLEN];
socklen_t addr_len = sizeof(client_addr);
client_data->fd = accept(server_fd,(struct sockaddr*)&client_addr,&addr_len);
if(client_addr.ss_family == AF_INET)
log_printf("New client from %s\n",inet_ntop(client_addr.ss_family,((struct sockaddr_in*)&client_addr)->sin_addr.s_addr ,numeric_addr,sizeof numeric_addr));
else if(client_addr.ss_family == AF_INET6)
log_printf("New client from %s\n",inet_ntop(client_addr.ss_family,((struct sockaddr_in6*)&client_addr)->sin6_addr ,numeric_addr,sizeof numeric_addr));
Anche se credo potrebbe farlo ancora più elegante e trasparente con getaddrinfo()
Ecco note aggiuntive su IP strato di indipendenza: http://uw714doc.sco.com/en/SDK_netapi/sockC.PortIPv4appIPv6.html http://www.kame.net/newsletter/19980604/
@nos: grazie per il tuo aiuto. Ho ancora una domanda, è possibile associare un socket udp a più di un indirizzo IP? per esempio, uno per ipv4 e uno per ipv6 totalmente 2. –
No, non è possibile associare un socket UDP a più di 1 (o tutti) indirizzi IP. È possibile tuttavia con SCTP, utilizzando le sue funzionalità multi-homing. Per TCP o UDP devi creare 1 socket per ciascun indirizzo che desideri ascoltare, a meno che non desideri ascoltare tutti gli indirizzi IP – nos
Per ottenere socket dualstack, esiste un'opzione socket che abilita o disabilita il comportamento dualstack - cerca IPV6_V6ONLY per maggiori informazioni. Se non lo fai, il tuo programma fallirà misteriosamente su determinati SO, su versioni specifiche. – christopher