不可能使用 1 个 TCP 套接字监听 2 个不同的 IP 地址,但是如果您使用 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/