任何一个ipv4地址总能表示成一个ipv6地址;一般来说一个ipv6地址无法表示成一个ipv4地址。
大多数双栈主机在处理监听套接字时应使用以下规则:
- ipv4监听套接字只能接受来自ipv4客户的外来连接。
- 如果服务器有一个绑定了通配地址的ipv6监听套接字,而且该套接字未设置 IPV6_V6ONLY 套接字选项,那么该套接字既能接受来自ipv4客户的外来连接,又能接受来自ipv6客户的外来连接。对于来自ipv4客户的连接而言,其服务端的本地地址将是某个本地ipv4地址对应的ipv4映射的ipv6地址。
- 如果服务器有一个ipv6监听套接字,而且绑定在其上的是除ipv4映射的ipv6地址以外的某个非通配ipv6地址,或者绑定的其上的是通配地址,不过还设置了IPV6_V6ONLY套接字选项,那么该套接字只能接受来自ipv6客户的外来连接。
源代码的可移植性
将这种向ipv6的转换视为促成程序变成协议无关的一次机会。去除所有 gethostbyname 和 gethostbyaddr 调用,改用与协议无关的 getaddrinfo 和 getnameinfo 接口。