INET_PTON - Linux手册页

时间:2019-08-20 18:00:38  来源:igfitidea点击:

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_addr

and 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.
首选格式是xxxxxxx:x。此格式由八个十六进制数字组成,每个十六进制数字表示一个16位值(即每个x最多可以为4个十六进制数字)。
2.
首选格式的一系列连续零值可以缩写为::。地址中只能出现::的一个实例。例如,回送地址0:0:0:0:0:0:0:1可以缩写为:: 1。由全零组成的通配符地址可以写为::。
3.
备用格式对于表达IPv4映射的IPv6地址很有用。此格式写为xxxxxx: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)。

InterfaceAttributeValue
inet_pton()Thread safetyMT-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/