INET_PTON - Linux手册页
Linux程序员手册 第3部分
更新日期: 2020-06-09
名称
inet_pton-将IPv4和IPv6地址从文本转换为二进制形式
语法
#include <arpa/inet.h> int inet_pton(int af, const char *src, void *dst);
说明
此函数将字符串src转换为af地址族中的网络地址结构,然后将网络地址结构复制到dst。 af参数必须是AF_INET或AF_INET6。 dst以网络字节顺序写入。
当前支持以下地址族:
- AF_INET
- src指向包含点分十进制格式的IPv4网络地址的字符串" ddd.ddd.ddd.ddd",其中ddd是一个十进制数字,范围为0到255之间的三位数。该地址被转换为一个struct in_addr并复制到dst,该长度必须为sizeof(struct in_addr)(4)字节(32位)长。
- AF_INET6
- src
points to a character string containing an IPv6 network address.
The address is converted to a
struct in6_addrand copied to
dst,which must be
sizeof(struct in6_addr)(16) bytes (128 bits) long.
The allowed formats for IPv6 addresses follow these rules:- 1.
- 首选格式是x:x:x:x:x:x:x:x。此格式由八个十六进制数字组成,每个十六进制数字表示一个16位值(即每个x最多可以为4个十六进制数字)。
- 2.
- 首选格式的一系列连续零值可以缩写为::。地址中只能出现::的一个实例。例如,回送地址0:0:0:0:0:0:0:1可以缩写为:: 1。由全零组成的通配符地址可以写为::。
- 3.
- 备用格式对于表达IPv4映射的IPv6地址很有用。此格式写为x:x:x:x:x:x:dddd,其中六个前导xs是十六进制值,它们定义了地址的六个最高有效16位部分(即96位),而ds以点分十进制表示的值定义了地址的最低有效32位。这样的地址的示例是:: FFFF:204.152.189.116。
- 有关IPv6地址表示的更多详细信息,请参见RFC 2373。
返回值
inet_pton()成功返回1(网络地址已成功转换)。如果src不包含表示指定地址族中有效网络地址的字符串,则返回0。如果af不包含有效的地址族,则返回-1并将errno设置为EAFNOSUPPORT。
属性
有关本节中使用的术语的说明,请参见attribute(7)。
Interface | Attribute | Value |
inet_pton() | Thread safety | MT-Safe locale |
遵循规范
POSIX.1-2001,POSIX.1-2008。
备注
与inet_aton(3)和inet_addr(3)不同,inet_pton()支持IPv6地址。另一方面,inet_pton()仅接受点分十进制表示法的IPv4地址,而inet_aton(3)和inet_addr(3)允许使用更通用的数字和点表示法(十六进制和八进制数字格式,以及不支持t要求将所有四个字节显式写入)。有关同时处理IPv6地址和以点号表示的IPv4地址的接口,请参见getaddrinfo(3)。
BUGS
AF_INET6无法识别IPv4地址。必须在src中提供显式的IPv4映射的IPv6地址。
示例
下面的程序演示了inet_pton()和inet_ntop(3)的用法。以下是一些示例运行:
$ ./a.out i6 0:0:0:0:0:0:0:0 :: $ ./a.out i6 1:0:0:0:0:0:0:8 1::8 $ ./a.out i6 0:0:0:0:0:FFFF:204.152.189.116 ::ffff:204.152.189.116
Program source
#include <arpa/inet.h> #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { unsigned char buf[sizeof(struct in6_addr)]; int domain, s; char str[INET6_ADDRSTRLEN]; if (argc != 3) { fprintf(stderr, "Usage: %s {i4|i6|<num>} string\n", argv[0]); exit(EXIT_FAILURE); } domain = (strcmp(argv[1], "i4") == 0) ? AF_INET : (strcmp(argv[1], "i6") == 0) ? AF_INET6 : atoi(argv[1]); s = inet_pton(domain, argv[2], buf); if (s <= 0) { if (s == 0) fprintf(stderr, "Not in presentation format"); else perror("inet_pton"); exit(EXIT_FAILURE); } if (inet_ntop(domain, buf, str, INET6_ADDRSTRLEN) == NULL) { perror("inet_ntop"); exit(EXIT_FAILURE); } printf("%s\n", str); exit(EXIT_SUCCESS); }
另外参见
getaddrinfo(3),inet(3),inet_ntop(3)
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。