INET - Linux手册页

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

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)。

InterfaceAttributeValue
inet_aton(),inet_addr(),
inet_network(),inet_ntoa()
Thread safetyMT-Safe locale
inet_makeaddr(),inet_lnaof(),
inet_netof()
Thread safetyMT-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/