我正在研究连接到用户指定的公共服务器的网络客户端程序.如果用户给我一个连接的主机名,它同时具有IPv4和IPv6地址(通常是包含两者A
和AAAA
记录的DNS名称),我不知道应该如何决定应该连接哪个地址.
问题是,机器支持IPv4和IPv6是很常见的,但只能通过IPv4实现全局连接.最常见的情况是仅配置IPv6链路本地地址.目前我能想出的最佳选择是:
我可以通过选项1看到的问题是连接可能不会立即失败 - 可能需要很长时间才能超时.
请尝试IPv6.在绝大多数安装中,如果由于某种原因无法成功,尝试创建IPv6连接将立即失败:
当然,事情可能会中断,例如,如果配置了全局(或隧道)地址,并且错误地过滤掉了ICMPv6错误消息.你不应该担心这种情况 - 也可能是因为IPv4连接在某种程度上被破坏了.
当然,这是值得商榷的你是否真的需要尝试IPv6地址第一 -你还不如尝试一下第二.通常,您应该按照从getaddrinfo返回的顺序尝试地址.今天,系统支持配置选项,让管理员决定从getaddrinfo返回地址的顺序.