gpt4 book ai didi

C - inet_pton() 不生成网络字节顺序

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

我对 inet_pton() 函数感到困惑。根据man page

This function converts the character string src into a network address structure in the af address family, then copies the network address structure to dst. The af argument must be either AF_INET or AF_INET6. dst is written in network byte order.

因此该函数产生一个网络字节顺序值。但是我得到了这段代码:

 struct sockaddr_in a;
char sip[20];
inet_pton(AF_INET, "192.168.0.182", (void *)&a.sin_addr);
inet_ntop(AF_INET, (void *)&a.sin_addr, sip, 20);

printf("htonl:%08x\n", htonl(a.sin_addr.s_addr));
printf("inet_pton:%08x\n", a.sin_addr.s_addr);
printf("inet_ntop:%s\n", sip);

输出:

htonl:c0a800b6
inet_pton:b600a8c0
inet_ntop:192.168.0.182

inet_pton的输出是b6.00.a8.c0,转换为182.0.168.192,也不同于htonl 的输出。

因为 htonl 将主机字节顺序转换为网络字节顺序,所以如果 inet_pton 生成网络字节顺序,我想它们的输出应该是相同的?这是否意味着 inet_pton 实际上会生成主机字节顺序?

如果 inet_pton 已经生成了 network byte order,为什么我需要 htonl 来获得正确的值?

最佳答案

是的,inet_pton按网络顺序将地址字节放入目标缓冲区。让我们通过一个例子来看看会发生什么。使用您的地址“192.168.0.182”,inet_pton产生这四个字节:

c0   a8  00  b6    (hex)
192 168 0 182 (dec)

网络字节顺序。当您随后调用 htonl (这实际上是不正确的——您应该调用 ntohl 网络顺序转换为主机顺序,但正如@ZanLynx 指出的那样,这两个函数在 x86 上是相同的),您重新排序字节到:

b6 00 a8 c0

但随后您将该表单传递给 printf%x作为格式。这告诉 printf将四个字节解释为单个 32 位整数,但 x86 是小端机器,因此当它将四个字节作为整数加载时,b6是最低位字节,c0是最高的,产生你所看到的:

htonl:c0a800b6

所以,一般来说,如果你有一个网络形式的 IPv4 地址,并且你想以对你(作为程序员)“有意义”的顺序快速显示它(用于调试或其他),你将使用:

printf("%x\n", ntohl(a.sin_addr.s_addr));

您还可以按照网络顺序显示单个字节(这实际上是完全相同的事情,但可能更容易理解),只需使用 unsigned char * (或等效于 uint8_t * 来自 <stdint.h> )打印单个字节:

uint8_t *ipp = (void *)&a.sin_addr.s_addr;
printf("%02x %02x %02x %02x\n", ipp[0], ipp[1], ipp[2], ipp[3]);

(您需要在此处使用无符号类型以避免符号扩展。在上面的语句中,每个字符都将在对 int 的调用中提升为 printf。如果您有一个带符号的 char 包含,例如,0xc0,它通常会被符号扩展为 32 位 int:0xffffffc0。作为替代方案,您可以使用格式规范 "%02hhx",它明确告诉 printf 您确实传递了一个 char ;然后它只会查看每个提升的 int 的最低位字节。)

关于C - inet_pton() 不生成网络字节顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53646246/

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