我有一個addrinfo中的結構,我得到通過調用getaddrinfo()
功能具有以下參數:如何將getaddrinfo中的IPv6地址存儲到字符數組中?
getaddrinfo(address, NULL, &hints, &res)
我需要將IPv6地址存儲在二進制形式,並以十六進制形式打印出來。
我的問題是,如何將IPv6地址存儲在16個元素的字符數組中?
我有一個addrinfo中的結構,我得到通過調用getaddrinfo()
功能具有以下參數:如何將getaddrinfo中的IPv6地址存儲到字符數組中?
getaddrinfo(address, NULL, &hints, &res)
我需要將IPv6地址存儲在二進制形式,並以十六進制形式打印出來。
我的問題是,如何將IPv6地址存儲在16個元素的字符數組中?
如果getaddrinfo調用成功,那麼res包含可用的struct addrinfo的鏈接列表,您可以在其中使用它的ai_addr成員獲取ipaddress。 如果ai_family是AF_INET6,那麼你可以通過以下複製的IPv6地址:
unsigned char buf[16];
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));
是的,修正了這個問題。 :) – fluter
將地址存入緩衝區之後,可以對十六進制輸出執行此操作。
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]);
}
你是什麼意思「以二進制形式存儲[某物]」?電腦中的所有東西都是二元的。 – immibis
我想區分不使用inet_ntop來清除混淆,因爲我需要十六進制格式的結果。 – Kuyss