首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >没有IPv6的IPv6网络编程?

没有IPv6的IPv6网络编程?
EN

Stack Overflow用户
提问于 2012-05-14 02:41:18
回答 2查看 630关注 0票数 0

好了,我已经开始做一些套接字编程了,我试图同时学习如何使用标准的BSD实现,以及如何将其转换为Windows上的Winsock API。我正在设置自己的Winsock实用程序库头,它可以包含在未来包含网络的项目中。我希望我的库是IPv4/6不可知的,因为它有同时支持IPv4和IPv6的函数。

我遇到的问题是,我在任何地方都无法访问互联网服务,显然无法连接到任何IPv6互联网。我知道六月份是世界IPv6日,所以也许这种情况会有所改变。我对此表示怀疑..无论如何,我无法测试我编写的任何函数,这些函数特别适用于IPv6地址或主机。

下面是一个示例:

我有一个函数,它将主机名作为字符串,解析它,然后以字符串的形式返回一个可显示的IP地址。我有一个版本的ip_string(),它返回它可以在地址族AF_INET或AF_INET6中获得的第一个好的IP地址。第二个版本的ip4_string()将只返回一个IPv6地址,ip6_string()也将返回一个IPv6地址。

代码语言:javascript
运行
复制
char *ip_string(const char hostname[])
{
    char *buffer = new char[INET6_ADDRSTRLEN];
    struct addrinfo hints, *res, *ptr;
    void *addr = NULL;  // void pointer to be set to sin_addr or sin6_addr

    /** Initialize hints structure */
    ZeroMemory(&hints, sizeof(hints));
    hints.ai_family = AF_UNSPEC; // ipv4 or ipv6 address family
    hints.ai_socktype = SOCK_STREAM;

    /** Function getaddrinfo returns non-zero if there's a problem */
    if (getaddrinfo(hostname, "http", &hints, &res) != 0)
        throw WinsockException("getaddrinfo()");

    /** Loop through list of address structures till we find a valid IP */
    const int MAX_ATTEMPTS = 15;
    int i = 0;
    for (ptr = res; (ptr != NULL); ptr = ptr->ai_next)
    {
        if (i++ <= MAX_ATTEMPTS)
        {
            if (ptr->ai_family == AF_INET)
            {       // Cast appropriately for ipv4
                addr = &(((struct sockaddr_in *)ptr->ai_addr)->sin_addr);
                inet_ntop(ptr->ai_family, (in_addr*) addr, buffer, INET_ADDRSTRLEN);
            }
            else if (ptr->ai_family == AF_INET6)
            {       // Cast appropraitely for ipv6
                addr = &(((struct sockaddr_in6 *)ptr->ai_addr)->sin6_addr);
                inet_ntop(ptr->ai_family, (in6_addr*) addr, buffer, INET6_ADDRSTRLEN);
            }
        }
    }

    freeaddrinfo(res);  // free list of address structures
    if (addr == NULL)
    {
        delete [] buffer;
        return NULL;
    }

    return buffer;
}

我遇到的问题是(我假设)因为我没有连接到IPv6地址空间(我确认了test-ipv6.com),任何时候这些函数中的任何一个在ipv6主机上调用getaddrinfo()时,该函数似乎根本不会返回。

这是正常的吗?有没有办法检查连接,看看是否通过Winsock API启用了ipv6?有没有什么好方法可以让我在非ipv6连接上测试启用了ipv6的代码?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-14 05:13:27

您可以设置自己的小型IPv6网际网络来测试这一点,但是只需要为自己建立一个IPv6隧道会容易得多。

即使您的提供商不提供IPv6访问(您应该为此对他们大喊大叫!)您仍然可以获得可用的IPv6连接。以Hurricane Electric为例。

你眼前的问题可能和卡罗莉说的一样简单。只要去掉for循环中的第一个if()语句即可。这无论如何都是多余的(除了额外的i++会破坏一些东西!)

票数 4
EN

Stack Overflow用户

发布于 2012-05-14 11:43:44

要回答有关检查IPv6可用性的问题,您可以使用WSAEnumProtocols()查看操作系统是否安装了IPv6,但这只会告诉您是否可以在代码中使用IPv6套接字和函数,而不会告诉您是否能够通过网络建立IPv6连接。如果您的网络不支持IPv6,那么您就无能为力了。我建议您自己买一台支持IPv6的路由器,并创建一个专用LAN进行测试。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10574255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档