INET_NET_PTON - Linux手册页

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

Linux程序员手册 第3部分
更新日期: 2020-06-09

名称

inet_net_pton,inet_net_ntop-Internet网络号转换

语法

#include <arpa/inet.h>

int inet_net_pton(int af, const char *pres,
                  void *netp, size_t nsize);

char *inet_net_ntop(int af, const void *netp, int bits,
                    char *pres, size_t psize);

与-lresolv链接。

glibc的功能测试宏要求(请参阅feature_test_macros(7)):

inet_net_pton(),inet_net_ntop():

Since glibc 2.20:
_DEFAULT_SOURCE
Before glibc 2.20:
_BSD_SOURCE || _SVID_SOURCE

说明

这些功能在表示(即可打印)格式和网络(即二进制)格式之间转换网络号。

对于这两个函数,af指定用于转换的地址族。唯一支持的值为AF_INET。

inet_net_pton()

inet_net_pton()函数将pres(以演示文稿格式包含Internet网络号的空终止字符串)转换为网络格式。转换结果以网络字节顺序排列,放置在net指向的缓冲区中。 (netp参数通常指向in_addr结构。)nsize参数指定netp中可用的字节数。

成功时,inet_net_pton()返回放置在netp中的​​结果的网络号字段中的位数。有关输入显示格式和返回值的讨论,请参见"注意"。

注意:在调用inet_net_pton()之前,应将netp指向的缓冲区清零,因为该调用仅写入网络号所需的字节数(或pres明确指定的字节数),该字节数可能小于网络号完整网络地址中的字节数。

inet_net_ntop()

inet_net_ntop()函数将netp指向的缓冲区中的网络号转换为表示格式。 * netp被解释为网络字节顺序的值。 bits参数指定* netp中网络号中的位数。

以null结尾的presentation-format字符串放置在由pres指向的缓冲区中。 psize参数指定pres中可用的字节数。表示字符串为CIDR格式:点分十进制数代表网络地址,后跟斜杠,以及网络数的大小(以位为单位)。

返回值

成功时,inet_net_pton()返回网络号中的位数。如果出错,则返回-1,并设置errno以指示错误原因。

成功时,inet_net_ntop()返回pres。如果出错,则返回NULL,并设置errno以指示错误原因。

错误说明

EAFNOSUPPORT
如果指定了AF_INET以外的其他值。
EMSGSIZE
输出缓冲区的大小不足。
ENOENT
(inet_net_pton())呈现格式不正确。

遵循规范

inet_net_pton()和inet_net_ntop()函数是非标准的,但可以广泛使用。

备注

Input presentation format for inet_net_pton()

网络号可以指定为十六进制值或点分十进制表示法。

十六进制值由初始的" 0x"或" 0X"表示。十六进制数字按网络字节顺序从左到右填充网络号的半字节(半个八位位组)。

在点分十进制表示法中,最多指定四个八位位组,以点分隔的十进制数。因此,可以接受以下任何形式:

A B C D
a.b.c

一种

每个部分都是一个介于0到255之间的数字,该数字按照网络字节(大字节序)的顺序从左到右填充所得网络号的一个字节。如果省略一部分,则网络号中的结果字节为零。

对于十六进制或点分十进制格式,可以选择在网络号后跟一个斜杠和一个介于0到32之间的数字,该数字以位为单位指定网络号的大小。

Return value of inet_net_pton()

inet_net_pton()的返回值是网络号字段中的位数。如果输入的显示字符串以斜杠和显式的大小值结尾,则该大小成为inet_net_pton()的返回值。否则,将按以下方式推断返回值(位):

*
如果网络号的最高有效字节大于或等于240,则位为32。
*
否则,如果网络号的最高有效字节大于或等于224,则位为4。
*
否则,如果网络号的最高有效字节大于或等于192,则位为24。
*
否则,如果网络号的最高有效字节大于或等于128,则位为16。
*
否则,位为8。

如果通过上述步骤得到的位数大于或等于8,但是网络号中指定的八位位组数超过了位/ 8,则将位设置为实际指定的八位位组数的8倍。

示例

下面的程序演示了inet_net_pton()和inet_net_ntop()的用法。它使用inet_net_pton()将其第一个命令行参数中提供的表示格式网络地址转换为二进制格式,并显示inet_net_pton()的返回值。然后,它使用inet_net_ntop()将二进制形式转换回表示形式,并显示结果字符串。

为了证明inet_net_pton()可能不会写入其netp参数的所有字节,程序允许使用可选的第二个命令行参数,该数字用于在inet_net_pton()调用之前初始化缓冲区。作为输出的最后一行,该程序显示inet_net_pton()返回的缓冲区的所有字节,使用户可以查看inet_net_pton()尚未触摸哪些字节。

运行示例,显示inet_net_pton()推断网络号中的位数:

$ ./a.out 193.168
inet_net_pton() returned: 24
inet_net_ntop() yielded:  193.168.0/24
Raw address:              c1a80000

证明inet_net_pton()不会将结果缓冲区中的未使用字节清零:

$ ./a.out 193.168 0xffffffff
inet_net_pton() returned: 24
inet_net_ntop() yielded:  193.168.0/24
Raw address:              c1a800ff

如果在演示字符串中提供的字节数超过了推断的值,则证明inet_net_pton()将扩大推断的网络号的大小:

$ ./a.out 193.168.1.128
inet_net_pton() returned: 32
inet_net_ntop() yielded:  193.168.1.128/32
Raw address:              c1a80180

明确指定网络号的大小会覆盖有关其大小的任何推断(但inet_net_pton():仍将使用显式指定的任何其他字节来填充结果缓冲区):

$ ./a.out 193.168.1.128/24
inet_net_pton() returned: 24
inet_net_ntop() yielded:  193.168.1/24
Raw address:              c1a80180

Program source

/* Link with "-lresolv" */

#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>

#define errExit(msg)    do { perror(msg); exit(EXIT_FAILURE); \
                        } while (0)

int
main(int argc, char *argv[])
{
    char buf[100];
    struct in_addr addr;
    int bits;

    if (argc < 2) {
        fprintf(stderr,
                "Usage: %s presentation-form [addr-init-value]\n",
                argv[0]);
        exit(EXIT_FAILURE);
    }

    /* If argv[2] is supplied (a numeric value), use it to initialize
       the output buffer given to inet_net_pton(), so that we can see
       that inet_net_pton() initializes only those bytes needed for
       the network number. If argv[2] is not supplied, then initialize
       the buffer to zero (as is recommended practice). */

    addr.s_addr = (argc > 2) ? strtod(argv[2], NULL) : 0;

    /* Convert presentation network number in argv[1] to binary */

    bits = inet_net_pton(AF_INET, argv[1], &addr, sizeof(addr));
    if (bits == -1)
        errExit("inet_net_ntop");

    printf("inet_net_pton() returned: %d\n", bits);

    /* Convert binary format back to presentation, using aqbitsaq
       returned by inet_net_pton() */

    if (inet_net_ntop(AF_INET, &addr, bits, buf, sizeof(buf)) == NULL)
        errExit("inet_net_ntop");

    printf("inet_net_ntop() yielded:  %s\n", buf);

    /* Display aqaddraq in raw form (in network byte order), so we can
       see bytes not displayed by inet_net_ntop(); some of those bytes
       may not have been touched by inet_net_ntop(), and so will still
       have any initial value that was specified in argv[2]. */

    printf("Raw address:              %x\n", htonl(addr.s_addr));

    exit(EXIT_SUCCESS);
}

另外参见

inet(3),网络(5)

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/