INET - Linux手册页
Linux程序员手册 第3部分
更新日期: 2020-06-09
名称
inet_aton,inet_addr,inet_network,inet_ntoa,inet_makeaddr,inet_lnaof,inet_netof-Internet地址操作例程
语法
#include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> int inet_aton(const char *cp, struct in_addr *inp); in_addr_t inet_addr(const char *cp); in_addr_t inet_network(const char *cp); char *inet_ntoa(struct in_addr in); struct in_addr inet_makeaddr(in_addr_t net, in_addr_t host); in_addr_t inet_lnaof(struct in_addr in); in_addr_t inet_netof(struct in_addr in);
glibc的功能测试宏要求(请参阅feature_test_macros(7)):
inet_aton(),inet_ntoa():
Since glibc 2.19: _DEFAULT_SOURCE In glibc up to and including 2.19: _BSD_SOURCE || _BSD_SOURCE
说明
inet_aton()将Internet主机地址cp从IPv4的数字和点表示法转换为二进制形式(以网络字节顺序),并将其存储在inp指向的结构中。如果地址有效,则inet_aton()返回非零,否则返回零。 cp中提供的地址可以采用以下形式之一:
- a.b.c.d
- 四个数字部分中的每一个都指定地址的一个字节。字节按从左到右的顺序分配以产生二进制地址。
- a.b.c
- 部分a和b指定了二进制地址的前两个字节。 c部分被解释为16位值,该值定义了二进制地址的最右边两个字节。此符号适用于指定(过时的)B类网络地址。
- a.b
- a部分指定了二进制地址的第一个字节。 b部分被解释为定义二进制地址最右边三个字节的24位值。该符号适用于指定(过时的)A类网络地址。
- a
- 值a解释为一个32位值,该值直接存储到二进制地址中,而无需任何字节重排。
在上述所有形式中,点地址的组成部分可以十进制,八进制(前导0)或十六进制(前导0X)指定。这些格式中的任何一种的地址统称为IPV4点号表示法。正好使用四个十进制数字的格式称为IPv4点分十进制表示法(有时也称为IPv4点分四进制表示法)。
如果成功解释了提供的字符串,则inet_aton()返回1;如果字符串无效(错误时未设置errno),则返回0。
inet_addr()函数将Internet主机地址cp从IPv4的数字和点符号转换为网络字节顺序的二进制数据。如果输入无效,则返回INADDR_NONE(通常为-1)。使用此功能存在问题,因为-1是有效地址(255.255.255.255)。避免使用它支持inet_aton(),inet_pton(3)或getaddrinfo(3),它们提供了一种更干净的方法来指示错误返回。
inet_network()函数将cp(IPv4数字和点符号的字符串)转换为主机字节顺序的数字,适合用作Internet网络地址。成功后,将返回转换后的地址。如果输入无效,则返回-1。
inet_ntoa()函数将Internet主机地址(以网络字节顺序指定)转换为IPv4点分十进制表示形式的字符串。该字符串在静态分配的缓冲区中返回,后续调用将覆盖该缓冲区。
inet_lnaof()函数返回Internet地址中的本地网络地址部分。返回值按主机字节顺序。
inet_netof()函数返回Internet地址的网络号部分。返回值按主机字节顺序。
inet_makeaddr()函数与inet_netof()和inet_lnaof()相反。它以网络字节顺序返回Internet主机地址,该地址是通过将网络号net与本地地址主机组合而成的,两者均以主机字节顺序进行。
inet_ntoa(),inet_makeaddr(),inet_lnaof()和inet_netof()中使用的结构in_addr定义为:
typedef uint32_t in_addr_t; struct in_addr { in_addr_t s_addr; };
属性
有关本节中使用的术语的说明,请参见attribute(7)。
Interface | Attribute | Value |
inet_aton(),inet_addr(), inet_network(),inet_ntoa() | Thread safety | MT-Safe locale |
inet_makeaddr(),inet_lnaof(), inet_netof() | Thread safety | MT-Safe |
遵循规范
inet_addr(),inet_ntoa():POSIX.1-2001,POSIX.1-2008、4.3BSD。
在POSIX.1中未指定inet_aton(),但在大多数系统上可用。
备注
在x86架构上,主机字节顺序是最低有效字节在前(小端),而在Internet上使用的网络字节顺序是最高有效字节在前(大端)。
inet_lnaof(),inet_netof()和inet_makeaddr()是旧版函数,假定它们正在处理有类的网络地址。分类网络将IPv4网络地址按字节边界划分为主机和网络组件,如下所示:
- Class A
- 此地址类型由(网络字节排序)地址的最高有效位中的值0表示。网络地址包含在最高有效字节中,主机地址占用其余三个字节。
- Class B
- 该地址类型由地址的最高两位中的二进制值10表示。网络地址包含在两个最高有效字节中,主机地址占据了其余两个字节。
- Class C
- 该地址类型由地址的最高三位中的二进制值110指示。网络地址包含在三个最高有效字节中,主机地址占据了其余字节。
目前,无类域间路由(CIDR)已取代了有类网络地址,该类将地址划分为任意位(而非字节)边界的网络和主机组件。
示例
下面显示了inet_aton()和inet_ntoa()的使用示例。以下是一些示例运行:
$ ./a.out 226.000.000.037 # Last byte is in octal 226.0.0.31 $ ./a.out 0x7f.1 # First byte is in hex 127.0.0.1
Program source
#define _BSD_SOURCE #include <arpa/inet.h> #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { struct in_addr addr; if (argc != 2) { fprintf(stderr, "%s <dotted-address>\n", argv[0]); exit(EXIT_FAILURE); } if (inet_aton(argv[1], &addr) == 0) { fprintf(stderr, "Invalid address\n"); exit(EXIT_FAILURE); } printf("%s\n", inet_ntoa(addr)); exit(EXIT_SUCCESS); }
另外参见
byteorder(3),getaddrinfo(3),gethostbyname(3),getnameinfo(3),getnetent(3),inet_net_pton(3),inet_ntop(3),inet_pton(3),主机(5),网络(5)
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。