什么是in_addr?

6
查看PHP手册中inet_pton的返回值和inet_ntop的参数时,两者都涉及到in_addr。在MSDN Dev Center上进行快速搜索,找到以下答案:

in_addr结构体表示IPv4 Internet地址。

但这并没有解释“结构体”究竟是什么。当使用随机IP(如219.225.174.153)测试inet_pton的返回值时,会得到一些奇怪的字符,例如€·Æô。那么in_addr的“结构体”究竟是什么?

我相信这取决于你所使用的系统,但我相信它与C语言中的in_addr有关:http://www.gta.ufrj.br/ensino/eel878/sockets/sockaddr_inman.html - Julio
3
那些不是“奇怪”的字符,它们是对应于219225174153的ASCII字符。请记住,点分四段只是一种更方便人类理解的方式,用来表达IPv4地址实际上是32位无符号整数的方法。 - Marc B
我也对php.net关于inet_pton()返回值的文档感到失望,因为它没有解释或至少提供有关in_addr数据类型的参考链接。我在SO上看到了多个答案,说明inet_pton()返回一个二进制字符串,但仍然没有链接到解释这一点的文档来源。 - John McMahon
1个回答

5
inet_pton()函数将一个人类可读的IP地址转换为4字节二进制字符串,用于网络操作,通常涉及原始套接字。这些“奇怪的字符”是数字219、225、174和153的ASCII字符表示形式,可能会根据系统的大小端(endian-ness)反转字节顺序。

每个IPv4地址本质上都是一个32位无符号整数,我们通过将其分为4个独立的8位数字[0到255]来创建这个数字的易于理解的表示方式,称为“点分十进制”表示法。

dotted quad example

如果您仅寻求更有效地存储IP地址数据而不是进行原始网络编程,则建议查看并/或使用ip2long()long2ip()函数。


2
请注意,函数ip2long()long2ip()不适用于IPv6地址,而inet_pton()inet_ntop()可以在启用了IPv6支持的情况下处理IPv4和IPv6地址。 - John McMahon

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