【发布时间】:2011-06-14 15:26:37
【问题描述】:
我正在使用 BSD 套接字,虽然我想很容易确定用户的 OS 是否支持 IPv6(通过尝试使用 AF_INET6 创建套接字),但我不确定如何以编程方式确定他们的路由器或 ISP 是否不支持这种连接。连接是否会失败,如果是,我如何区分该失败与服务器只是离线?
【问题讨论】:
标签: c networking ipv6 sockets
我正在使用 BSD 套接字,虽然我想很容易确定用户的 OS 是否支持 IPv6(通过尝试使用 AF_INET6 创建套接字),但我不确定如何以编程方式确定他们的路由器或 ISP 是否不支持这种连接。连接是否会失败,如果是,我如何区分该失败与服务器只是离线?
【问题讨论】:
标签: c networking ipv6 sockets
正如 Ulrich Drepper 在他的 Userlevel IPv6 Programming Introduction 中所说,您应该调用 getaddrinfo 并设置 AI_ADDRCONFIG 标志(确保您只会获得系统上当前配置的地址类型),然后按顺序尝试每个结果,直到一个成功(因为对结果进行排序,第一个最有可能成功,依此类推)或全部失败。
【讨论】:
This post 有很多关于这个主题的好信息,专门谈到getaddrinfo 提供这样的信息。
【讨论】:
一个想法是包含多个“质量”尽可能高的测试服务器。例如,我认为谷歌可以通过 IPv6 访问,并且他们倾向于保持他们的东西运行。再加上 4-5 个,你应该有相当低的概率将它们全部同时关闭。
【讨论】:
大多数配置了可公开路由地址的人(不是 fe80::/10 fc00::/7 和朋友)和 ipv6 默认路由预计会被连接。
但是,通常您不应该关心问题是因为服务器以某种特定方式无法访问,还是因为其他原因无法访问。
【讨论】: