No es posible escuchar en 2 direcciones IP diferentes con 1 socket TCP, sin embargo, si escucha en todas las interfaces usando la dirección in6addr_any, también incluirá todas las direcciones IPv4 (aunque creo que Linux tiene una opción kernel para deshabilitar ese mapeo).
La (nueva versión de) socket API es bastante transparente en cuanto a si está utilizando IPv4 o IPv6, pero se debe tener bastante cuidado sobre cómo una aplicación IPv4 se codifica normalmente.
p. Ej. este código IPv4 que acepta una conexión e imprime la dirección del 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));
tendría que ser convertido a la siguiente, que se ocupa de los protocolos IPv4 e 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));
Aunque te creo podría hacerlo aún más elegante y transparente con getaddrinfo()
Aquí hay notas adicionales sobre IP capa de independencia: http://uw714doc.sco.com/en/SDK_netapi/sockC.PortIPv4appIPv6.html http://www.kame.net/newsletter/19980604/
@nos: gracias por su ayuda. Tengo una pregunta más: ¿es posible vincular un socket udp a más de una dirección IP? por ejemplo, uno para ipv4 y uno para ipv6 totalmente 2. –
No, no puede vincular un socket UDP a más de 1 (o todas) direcciones IP tampoco. Sin embargo, puedes hacerlo con SCTP, utilizando sus funciones de búsqueda múltiple. Fot TCP o UDP tendrías que crear 1 socket para cada dirección en la que quieras escuchar, a menos que desees escuchar todas las direcciones IP – nos
Para obtener sockets de doble pila, hay una opción de socket que habilita o deshabilita el comportamiento de doble pila: busca IPV6_V6ONLY para más información. Si no lo hace, su programa fallará misteriosamente en ciertos sistemas operativos, en versiones específicas. – christopher