【问题标题】:How do I store an IPv6 address from getaddrinfo into a character array?如何将来自 getaddrinfo 的 IPv6 地址存储到字符数组中?
【发布时间】:2016-04-14 03:33:21
【问题描述】:

我有一个 addrinfo 结构,我通过使用以下参数调用 getaddrinfo() 函数获得:

getaddrinfo(address, NULL, &hints, &res)

我需要以二进制形式存储 IPv6 地址并以十六进制形式打印。

我的问题是,如何将 IPv6 地址存储在 16 个元素的字符数组中?

【问题讨论】:

  • “以二进制形式存储 [某物]”是什么意思?计算机中的一切都是二进制的。
  • 我想区分不使用 inet_ntop 来消除混乱,因为我需要十六进制形式的结果。

标签: c sockets ipv6 getaddrinfo


【解决方案1】:

如果 getaddrinfo 调用成功,则 res 包含一个可用结构 addrinfo 的链接列表,您可以在其中获取 ipaddress 及其 ai_addr 成员。 如果 ai_family 为 AF_INET6,则可以通过以下方式复制 ipv6 地址:

include <netinet/in.h>
unsigned char buf[INET_ADDRSTRLEN];
struct sockaddr_in6 *in6 = (struct sockaddr_in6*)addr->ai_addr;
memcpy(buf, in6->sin6_addr.s6_addr, 16);

转储地址的字节:

for (int i = 0; i < 16; i++) {
    printf("%02X", buf[i]);
    if (i < 15) putchar(':');
}

要以规范方式打印 ipv6 地址,请使用 inet_ntop:

char str[64];
printf("%s\n", inet_ntop(AF_INET6, buf, str, sizeof buf));

【讨论】:

  • 是的,已解决。 :)
【解决方案2】:

在将地址 memcpy 到缓冲区后,您可以对十六进制输出执行此操作。

unsigned char buf[16];
memcpy(&buf, &addr, 16);`

printf("0x");
int i;
for(i = 0; i < 16; i++)
{
      if(i && i % 2 == 0)
         printf (":");
      printf("%02x", buf[i]);
}

【讨论】:

    猜你喜欢
    • 2012-02-03
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    • 2010-12-16
    相关资源
    最近更新 更多