当前位置: 首页 > 面试题库 >

扩展一个IPv6地址,以便我可以将其打印到stdout

谷梁楚青
2023-03-14
问题内容

我正在使用getifaddrs()和inet_ntop()来获取系统上的ip地址。当系统设置为IPv6时,返回的地址为简化版本(使用::表示零)。有什么办法可以将该地址扩展为完整地址吗?

这是我正在使用的代码:

struct ifaddrs *myaddrs, *ifa;
void *in_addr;
char buf[64];

if(getifaddrs(&myaddrs) != 0)
{
    perror("getifaddrs");
    exit(1);
}

for (ifa = myaddrs; ifa != NULL; ifa = ifa->ifa_next)
{
    if (ifa->ifa_addr == NULL)
        continue;
    if (!(ifa->ifa_flags & IFF_UP))
        continue;

    switch (ifa->ifa_addr->sa_family)
    {
        case AF_INET:
        {
            struct sockaddr_in *s4 = (struct sockaddr_in *)ifa->ifa_addr;
            in_addr = &s4->sin_addr;
            break;
        }

        case AF_INET6:
        {
            struct sockaddr_in6 *s6 = (struct sockaddr_in6 *)ifa->ifa_addr;
            in_addr = &s6->sin6_addr;
            break;
        }

        default:
            continue;
    }

    if (!inet_ntop(ifa->ifa_addr->sa_family, in_addr, buf, sizeof(buf)))
    {
        printf("%s: inet_ntop failed!\n", ifa->ifa_name);
    }
    else
    {
        printf("IP address: %s\n", buf);
    }
}

freeifaddrs(myaddrs);

代码非常感谢。

编辑:
由于这显然很难理解,我举一个例子:

如果我得到abcd:12 :: 3,我需要将其扩展为abcd:0012:0000:0000:0000:0000:0000:0003
原因?因为这是要求的一部分。就那么简单。


问题答案:
void ipv6_to_str_unexpanded(char * str, const struct in6_addr * addr) {
   sprintf(str, "%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x",
                 (int)addr->s6_addr[0], (int)addr->s6_addr[1],
                 (int)addr->s6_addr[2], (int)addr->s6_addr[3],
                 (int)addr->s6_addr[4], (int)addr->s6_addr[5],
                 (int)addr->s6_addr[6], (int)addr->s6_addr[7],
                 (int)addr->s6_addr[8], (int)addr->s6_addr[9],
                 (int)addr->s6_addr[10], (int)addr->s6_addr[11],
                 (int)addr->s6_addr[12], (int)addr->s6_addr[13],
                 (int)addr->s6_addr[14], (int)addr->s6_addr[15]);
}


 类似资料:
  • 我有两台固定IP地址的linux计算机: 打印服务器,通过CUPS共享连接的打印机 (服务器的IP地址为“192.168.1.2”,打印机称为“test_printer”。) 不幸的是,通过CUPS的打印机传播似乎无法可靠地工作(可能是由于网络结构)。 我可以将打印作业直接从python程序发送到CUPS打印服务器吗? 如果是,你能提供一个小例子吗? 理论上,我只会将格式正确的数据发送到IP地址端

  • 我正在努力让Android上的OkHttpClient使用自定义证书发出HTTPS请求,同时绑定到特定网络接口的本地地址。我当前的尝试使用以下: 类实现为: 这主要是基于OkHttp GitHub站点的留档,它描述了如何将值传递给允许我们通过覆盖无参数的方法将每个套接字绑定到特定地址。但是,sslSocketFactory的文档没有提到任何关于能够绑定套接字的内容。当我使用上述代码运行我的应用程序

  • 问题内容: 我有一个Python项目,其中包含许多与distutils打包在一起的子模块。我想在C中构建一些Python扩展以生活在其中一些子模块中,但是我不明白如何使Python扩展生活在子模块中。以下是我正在寻找的最简单的示例: 这是我的Python扩展: 这是可行的: 在virtualenv中安装后,我可以这样做: 但是,我想生活在一个子模块中。我需要在此管道中进行哪些更改才能使Python

  • 问题内容: 如果我有几个具有所需功能的类,但想单独存储以进行组织,我可以扩展一个类以同时拥有这两个类吗? 即 编辑:我知道如何一次扩展一个类,但是我正在寻找一种使用多个基类立即扩展一个类的方法- AFAIK,您不能在PHP中做到这一点,但是应该有一些解决方法,而不必诉诸于, 问题答案: 回答您的编辑: 如果您确实想伪造多重继承,则可以使用魔术函数__call()。 尽管从A类用户的角度来看,这很丑

  • 问题内容: 我有使用地址的应用程序(它存储它们的时间很长),因此它只了解地址。 可以将地址转换为with 吗? 问题答案: 尽管IPv4地址范围具有等效的IPv6,但是您不能将所有IPv6地址都转换为IPv4-IPv6地址比IPv4地址更多。 解决此问题的唯一明智的方法是更新您的应用程序,以便能够理解和存储IPv6地址。