Невозможно прослушивать 2 разных IP-адреса с 1 сокетом TCP, однако, если вы прослушиваете все интерфейсы, используя адрес in6addr_any , который также будет включать все адреса IPv4 (хотя я считаю, что, например, У linux есть опция ядра, чтобы отключить это отображение).
API-интерфейс сокетов (более новая версия) достаточно прозрачен в отношении того, используете ли вы IPv4 или IPv6, но следует тщательно следить за тем, как обычно кодируется приложение IPv4.
например. этот код IPv4, который принимает соединение и распечатывает адрес удаленного хоста:
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));
Должен быть преобразован в следующее, которое обрабатывает как IPv4, так и 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));
Хотя я считаю, что вы могли бы сделать это еще более элегантно и прозрачно с помощью getaddrinfo ()
Вот дополнительные примечания о независимости уровня IP:
http://uw714doc.sco.com/en/SDK_netapi/sockC.PortIPv4appIPv6.html
http://www.kame.net/newsletter/19980604/