【问题标题】:How to determine if a user's router/ISP doesn't support IPv6 connections?如何确定用户的路由器/ISP 是否不支持 IPv6 连接?
【发布时间】:2011-06-14 15:26:37
【问题描述】:

我正在使用 BSD 套接字,虽然我想很容易确定用户的 OS 是否支持 IPv6(通过尝试使用 AF_INET6 创建套接字),但我不确定如何以编程方式确定他们的路由器或 ISP 是否不支持这种连接。连接是否会失败,如果是,我如何区分该失败与服务器只是离线?

【问题讨论】:

    标签: c networking ipv6 sockets


    【解决方案1】:

    正如 Ulrich Drepper 在他的 Userlevel IPv6 Programming Introduction 中所说,您应该调用 getaddrinfo 并设置 AI_ADDRCONFIG 标志(确保您只会获得系统上当前配置的地址类型),然后按顺序尝试每个结果,直到一个成功(因为对结果进行排序,第一个最有可能成功,依此类推)或全部失败。

    【讨论】:

    • 但是当你说“在系统上”时,这听起来像是 OS 支持的,而不是他们的网络支持的——或者我错了吗?
    • @oskar:这是您当前配置的接口,因此除非您的系统具有 IPv6 地址,否则您将不会获得任何 IPv6 地址,除非您的系统具有其中之一,否则不会获得 IPv4 地址。无论如何,我不希望不支持 IPv6 的操作系统首先返回 IPv6 地址。
    【解决方案2】:

    This post 有很多关于这个主题的好信息,专门谈到getaddrinfo 提供这样的信息。

    【讨论】:

    • 但是假设 getaddrinfo 返回一个包含 IPv6 地址的链表。这是否一定意味着我可以连接到该地址?换句话说,我可以肯定地说,如果我的路由器或 ISP 不支持 IPv6,getaddrinfo 将永远不会在 addrinfo 结构中包含这样的地址吗?
    【解决方案3】:

    一个想法是包含多个“质量”尽可能高的测试服务器。例如,我认为谷歌可以通过 IPv6 访问,并且他们倾向于保持他们的东西运行。再加上 4-5 个,你应该有相当低的概率将它们全部同时关闭。

    【讨论】:

    • 那么我可以假设 connect() 将以与正常失败连接无法区分的方式失败吗?我希望会返回一个不同的错误代码,但从逻辑上讲,我猜操作系统不会知道足够的信息来做到这一点。
    【解决方案4】:

    大多数配置了可公开路由地址的人(不是 fe80::/10 fc00::/7 和朋友)和 ipv6 默认路由预计会被连接。

    但是,通常您不应该关心问题是因为服务器以某种特定方式无法访问,还是因为其他原因无法访问。

    【讨论】:

    • 我之所以关心它由于 IPv6 而失败的原因是我可以将它编码为从那时起只尝试 IPv4 地址。
    猜你喜欢
    • 2023-03-31
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 2015-08-02
    • 1970-01-01
    • 2014-04-26
    • 1970-01-01
    • 2013-08-09
    相关资源
    最近更新 更多