如何将getaddrinfo中的IPv6地址存储到字符数组中?

时间:2016-04-14 03:33:21

标签: c sockets ipv6 getaddrinfo

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

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

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

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

2 个答案:

答案 0 :(得分:5)

如果getaddrinfo调用成功,则res包含可用struct addrinfo的链接列表,您可以在其中获取带有ai_addr成员的ipaddress。 如果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));

答案 1 :(得分:0)

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

https://buy.itunes.apple.com/verifyReceipt