首页 文章

没有IPv6的IPv6网络编程?

提问于
浏览
0

好的,所以我已经开始做一些套接字编程,我试图同时学习如何使用标准BSD实现做事情以及如何将其转换为Windows上的Winsock API . 我正在设置一个Winsock实用程序库头,可以包含在包含网络的未来项目中 . 我希望我的库与IPv4 / 6无关,因为它具有适用于IPv4和IPv6的功能 .

我遇到的问题是,我无法访问互联网服务,显然无法连接到任何IPv6互联网 . 我知道世界IPv6日将在6月份出现,所以这可能会改变 . 我对此表示怀疑..无论如何,我无法测试我编写的任何功能,特别是在IPv6地址或主机上 .

这是一个例子:

我有这个函数应该将主机名作为字符串,解析它然后返回一个可呈现的IP地址作为字符串 . 我有一个版本[ip_string()],它返回它可以在地址族AF_INET或AF_INET6中获得的第一个良好的IP地址 . 第二个版本[ip4_string()]将仅返回IPv6地址,而[ip6_string()]返回IPv6地址 .

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;
}

我'm having is that (I'问题中号假设),因为我不是那种可以达到IPv6地址空间(我证实test-ipv6.com)的连接上,任何时候任何函数调用的getaddrinfo()一个IPv6主机的功能似乎并不返回 .

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

2 回答

  • 4

    您可以设置自己的小型IPv6网络来测试这一点,但是让自己成为IPv6隧道要容易得多 .

    即使您的提供商不提供IPv6访问(您应该为此大喊大叫!),您仍然可以获得可用的IPv6连接 . 比如说Hurricane Electric .

    你的直接问题可能就像Karoly所说的那么简单 . 只需删除for循环中的第一个if()语句 . 无论如何,这是多余的(除此之外,额外的我打破了事情!) .

  • 0

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

相关问题