什么是 in_addr_t、inet_ntoa 等类型的地址?

10

在发布这个问题之前,我查看了这里的讨论: in_addr_t to string

我的问题不同。

我知道inet_ntoa函数的类型如下:

char * inet_ntoa (struct in_addr in);

我想知道的是 in_addr_t 是什么。

当它在套接字程序中使用时,它将表示什么。

我查看了 <netinet/in.h> 中的结构定义。

   typedef uint32_t in_addr_t;

   struct in_addr {
       in_addr_t s_addr;
   };
这个变量的类型是 in_addr_t,我不想像 inet_ntoa 那样将它打印为 char *。我想看看 in_addr_t 的内容。那么如何实现或者说 in_addr_t 到底是什么,为什么在套接字编程中一次又一次地使用它?如果我没有弄错,它被定义为 typedef uint32_t in_addr_t;。所以,如果 in_addr_t 是无符号 32 位整数,我想查看其中的内容,而不是向 stdout 打印类似 192.168.1.1 的输出。

根据你所提出的问题,我建议你阅读像Comer所著的经典书籍《TCP/IP网络互连》这样的书。 - Ben Jackson
2个回答

18

众所周知(我们都知道,对吧?),IPv4地址使用无符号32位整数表示。我们这些微不足道的人类不太擅长处理大数(或小数),因此使用点十进制表示法。(你知道你现在在 1076000524 吗?我也不知道)。

然而,既然你挖掘了netinet并找到了标准中明确定义的内容:

<netinet/in.h>头文件将定义in_addr结构体,其中至少包括以下成员:

in_addr_t s_addr

其中

in_addr_t相当于 <inttypes.h> 中描述的uint32_t类型。

因此你可以打印它。

printf("My unreadable addres is %u\n", in.s_addr);

快速回答,134744072代表什么?


3
你没有指明最重要的事情——字节顺序。其他都很明显。 - Simon
@Simon 你能详细说明一下吗? - cnicutar
2
网络字节序是大端字节序。无论架构如何,您必须使用诸如“htons”/“htonl”(“主机到网络,短/长”)或“ntohs”/“ntohl”(“网络到主机,短/长”)等函数来获取正确的值。 - Diti
顺便提一下,134744072 的结果不受字节序影响 :) - mathway

0

你需要使用以下方式将134744072转换为十六进制:

printf("My unreadable address is %lX\n", in.s_addr);

使用%lX来表示长无符号十六进制数。 此地址为:8.8.8.8


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接