如何将 getaddrinfo 中的 IPv6 地址存储到字符数组中?
How do I store an IPv6 address from getaddrinfo into a character array?
我有一个 addrinfo 结构,它是通过使用以下参数调用 getaddrinfo()
函数获得的:
getaddrinfo(address, NULL, &hints, &res)
我需要以二进制形式存储IPv6地址并以十六进制形式打印。
我的问题是,如何将 IPv6 地址存储在包含 16 个元素的字符数组中?
如果 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));
将地址 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]);
}
我有一个 addrinfo 结构,它是通过使用以下参数调用 getaddrinfo()
函数获得的:
getaddrinfo(address, NULL, &hints, &res)
我需要以二进制形式存储IPv6地址并以十六进制形式打印。
我的问题是,如何将 IPv6 地址存储在包含 16 个元素的字符数组中?
如果 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));
将地址 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]);
}