gpt4 book ai didi

c - inet_ntop 打印不正确的 IPv6 地址

转载 作者:太空宇宙 更新时间:2023-11-04 00:35:39 25 4
gpt4 key购买 nike

我似乎从 inet_ntop 取回了错误的 IPv6 字符串,尤其是在它试图丢弃零序列以支持“::”的地址时。

这是代码;

#include <stdio.h>
#include <stdint.h>
#include <arpa/inet.h>

int main (void)
{
uint32_t ip[4] = {0xe0e0e0e0, 0xf0f0f0f0, 0x0, 0x1};
char addr[INET6_ADDRSTRLEN] = "";

inet_ntop(AF_INET6, ip, addr, INET6_ADDRSTRLEN);
printf("address = %s",addr);
return 0;
}

当我运行它时,我得到以下输出;

address = address = e0e0:e0e0:f0f0:f0f0::100:0

这对我来说看起来很不对,我会期待类似的东西;

address = e0e0:e0e0:f0f0:f0f0::1

有人知道这是怎么回事吗?

谢谢

最佳答案

注释,注意字节顺序正确。您还应该真正使用 struct in6_addr 作为 IP 地址。这是一个将其初始化为字节序列的示例,它给出了预期的输出:

#include <stdio.h>
#include <stdint.h>
#include <arpa/inet.h>

int main (void)
{
const struct in6_addr ip = { 0xe0, 0xe0, 0xe0, 0xe0,
0xf0, 0xf0, 0xf0, 0xf0,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x01 };
//const uint32_t ip[4] = { 0xe0e0e0e0, 0xf0f0f0f0, 0x0, 0x1 };
char addr[INET6_ADDRSTRLEN];

inet_ntop(AF_INET6, &ip, addr, INET6_ADDRSTRLEN);
printf("address = %s",addr);
return 0;
}

gcc main.c && ./a.out 结果:address = e0e0:e0e0:f0f0:f0f0::1

这是一个比较 x86 机器上字节顺序的简单示例:

#include <stdio.h>
#include <stdint.h>
#include <arpa/inet.h>

int main (void)
{
const struct in6_addr ip_uint8 = { 0xe0, 0xe0, 0xe0, 0xe0,
0xf0, 0xf0, 0xf0, 0xf0,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x01 };
const uint32_t ip_uint32[4] = { 0xe0e0e0e0, 0xf0f0f0f0, 0x0, 0x1 };
char addr[INET6_ADDRSTRLEN];

inet_ntop(AF_INET6, &ip_uint8, addr, INET6_ADDRSTRLEN);
printf("address = %s\n",addr);

unsigned char* b = (unsigned char*)&ip_uint8;
printf("address bytes uint8 :");
for( int i=0; i<16; i++) {
printf(" %2.2X", b[i]);
}
printf("\n");

b = (unsigned char*)&ip_uint32;
printf("address bytes uint32:");
for( int i=0; i<16; i++) {
printf(" %2.2X", b[i]);
}
printf("\n");

return 0;
}

给出输出:

address = e0e0:e0e0:f0f0:f0f0::1
address bytes uint8 : E0 E0 E0 E0 F0 F0 F0 F0 00 00 00 00 00 00 00 01
address bytes uint32: E0 E0 E0 E0 F0 F0 F0 F0 00 00 00 00 01 00 00 00

0xe0e0e0e0 这样的重复字节示例在尝试调试这类问题时对您没有任何帮助,0x01020304 会让您更好地了解出了什么问题。

关于c - inet_ntop 打印不正确的 IPv6 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38848281/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com