init_ntop()函数的功能是将32位IPv4和128位IPv6地址转换为可读格式。与init_ptop函数不同的是,地址是以原始形式转换的,因为它是通过使用init_pton()转换为一些二进制数字形式。这意味着这两个函数都可以用于加密和解密IP地址的隐私目的。
语法
#include <arpa/inet.h>
# const character *inet_ntop(int af, const void *source, character *dst, socklen_t size);
就像init_pton一样,它有三个主要参数作为参数,但它还有第四个参数,处理 "dst "所指向的socket/buffer的大小。这里,我们将描述init_ntop()函数中的参数。
参数
该函数的一般描述是:该函数将IP地址转换为可读的二进制格式。这主要是一种简单文本的数字形式。这种转换是通过指定的 "src "完成的,它以文本格式进行转换,然后将结果值放在 "dst "中。有必要检查dst(目的地)区域的大小/空间。因为如果这个地方足以存储地址,那么就会放置结果地址。在第二种情况下,需要有一个空闲的缓冲区扩展来添加地址。
参数 "af "指的是互联网地址的家族。默认情况下,对于IPv4可以是AF_INET,对于IPv6可以是AF_INET6。参数 "src "显示了如果 "af "参数为AF_INET或IPv6,则容纳IPv4互联网地址的缓冲区。提供的地址必须按网络字节的顺序排列。
就像源参数一样,目的地 "ds "指的是缓冲区,init_ntop()函数将在这里以字符串的形式存储结果地址。第4个参数是指向缓冲区大小的size参数。对于这个参数,说明它应该总是为目的地指定一个非空的参数。对于IPv6地址,存储缓冲区应该至少有46字节,而对于IPv4地址,缓冲区应该至少有16字节。
以缓冲区的形式分配存储是必要的,而且应该在优先级上进行,因为大小对存储结果值的地址很重要,以避免任何与大小有关的麻烦。我们已经定义了两个约束条件,允许应用程序轻松地声明/分配精确大小的缓冲区,以获取字符串格式的IPv4和IPv6地址。这些约束也被定义在库<netinet/in.h>中。
#define INET_ADDRSTLEN 16
#define INET_ADDRSTRLEN 46
返回值
返回类型是函数在两种情况下获得的值;要么是成功调用,要么是由于任何错误而不成功地终止。但它总是返回;这就是为什么我们总是对主函数使用'int'返回类型。如果函数成功,inet_ntop()返回一个指针,该指针被返回到包含转换过程后地址的缓冲区。另一方面,如果函数不成功,inet_ntop()返回一个NULL或一个'0',并发送errno以方便纠正错误。
由函数init_ntop()引起的错误
许多可能的错误会抑制init_ntop()函数的有效执行,但我们在此主要强调其中的两个。
EAFNOSUPPORT
一个参数是一个无效的数字。换句话说,它不属于所支持的网络的一个系列。
ENOSPC
这个错误的发生是因为存储转换后的地址的空间较少。目标 "dst "不大,这导致有足够的存储空间来存储结果值或转换后的地址。所以errno提到了原因,然后这些错误被删除。
就像inet_pton,init_ntop也与socket编程有关。因为socket函数包含域参数,作为属于AF_INET(IP)的参数,所以在两种协议的情况下,都选择IPv4或Ipv6。
INIT_NTOP()的实现
在开始实施之前,我们已经看到Ubuntu Linux操作系统的手册页面上也分享了这个函数的用法和一般描述,以方便用户了解其工作功能。
$ man inet_ntop

使用上述命令,用户会被引导到一个包含init_ntop()所有描述的页面。我们附上一个片段供你参考。

例子1
我们在Linux操作系统上实现了这些例子;为此,你需要有一个文本编辑器,在里面写源代码。而对于结果的数值,我们将使用Ubuntu终端。打开Ubuntu默认的文本编辑器,使用下面提到的源代码来演示init_ntop()的工作。
Init_ntop()的工作原理与init_pton相反;如果你对init_pton()有一些了解,你会很容易理解其功能。否则,在C语言编程中使用这些函数,转换地址并不困难。
从库开始,你可以看到我们使用了一个arpa/inet.h库,因为它包含了所有关于互联网地址的信息。另一方面,系统套接字库也需要为首,因为没有它,连接是不可能的。
#include <sys/socket.h>
#include <arpa/inet.h>
在库之后,我们用约束条件提到了关于互联网协议4和6的地址。这里提供的地址是一个二进制格式转换为数字的、容易理解的格式。这里为th4和6的IP都初始化了两个结构。同样,这里也用两个缓冲区来存储结果值。通过调用init_ntop函数,应该确保缓冲区的大小不是空的。然后,在转换之后,显示地址。在另一个部分,需要确定错误。类似的情况是SF_INET6。

执行时需要一个编译器。这是一个GCC编译器。有了编译器,就会提到文件名。她的'ntp.c'是一个文件的名称。
$ gcc –o ntop ntop.c
$./ ntop

执行时,你会看到两个互联网协议的地址都能成功显示,没有遇到任何错误。
例2
这个例子涉及到在一个C源代码中集体使用inet_ntop()和inet_pton()两个函数。pton()函数包含三个参数的地址。同时,inet_ntop()有4个缓冲区大小的参数。首先,pton()将地址转换为二进制格式,其数值不容易被人类读取。init_ntop()将其转换回文本格式。

编译该代码并执行它。

你可以看到,通过使用一个简单的字符串来创建文本格式的地址,作为输入提供的地址在显示时没有任何变化。
结论
这篇文章 "init_ntop函数示例 "包含了所有可能的关于ntop()函数使用的一般描述,以及它使用的参数。还提到了一些错误,如果在存储空间或源目的地方面出了问题,需要加以识别。总之,我们使用了两个基本但有影响的例子来演示这个函数的工作。