in_addr_t inet_ntoa 等类型的地址是啥

Posted

技术标签:

【中文标题】in_addr_t inet_ntoa 等类型的地址是啥【英文标题】:what are addresses of type in_addr_t inet_ntoa etcin_addr_t inet_ntoa 等类型的地址是什么 【发布时间】:2011-09-25 17:05:56 【问题描述】:

好的,在发布这个问题之前,我已经在这里检查了线程 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;
   ;

属于上述类型。我不想像 inet_ntoa 那样将 in_addr_t 打印到 char * 上。 我想看看 in_addr_t 是什么。那么它是如何完成的或者 in_addr_t 到底是什么以及为什么在套接字编程中一次又一次地使用它。 如果我没记错的话,它被定义为

typedef uint32_t in_addr_t;

所以如果in_addr_tunsigned 32 bit int 我想看看那是什么而不是char * 在标准输出上打印192.168.1.1 类型的输出。

【问题讨论】:

根据您一直在问的问题,我建议您阅读 Comer 的经典 Internetworking with TCP/IP 之类的书。 【参考方案1】:

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

但是,既然你翻遍了netinet,发现了the standard

明确指出的内容

<netinet/in.h> 标头应定义 in_addr 结构,应 至少包括以下成员:

in_addr_t s_addr

这是

in_addr_t 等效于uint32_t 类型,如<inttypes.h> 中所述

你可以打印出来。

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

快,134744072 代表什么?

【讨论】:

您没有指定最重要的东西 - 字节顺序。其他一切都很明显。 @Simon 你能扩展一下吗? @cnicutar 网络字节顺序为大端。您必须使用诸如htons/htonl(“主机到网络,短/长”)或ntohs/ntohl(“网络到主机,短/长”)之类的函数来获取正确的值,无论架构。

以上是关于in_addr_t inet_ntoa 等类型的地址是啥的主要内容,如果未能解决你的问题,请参考以下文章

c++中一个long类型数据转换成IP地址

如何使用inet_ntoa函数

inet_ntoa的基本介绍

使用inet_ntoa() 时编译提示错误:

PHP 中的 INET_ATON() 和 INET_NTOA()?

Linux 64位系统下 inet_ntoa 报段错误问题