学习C语言的inet_pton函数

2,208 阅读4分钟

函数inet_pton()用于转换互联网地址,即IP地址,以文本形式包含数字二进制格式。该函数用于将人类可读的IP地址转换为二进制格式的地址。

inet_pton函数适用于IPv4和IPv6互联网网络地址。在这种情况下,当UNICODE没有定义时,Inet_pton被定义为inet_ptonA。

套接字编程和Inet_pton()

套接字是许多操作系统提供的一种进程/机制,以便所有程序都能相应地访问网络。套接字机制主要不依赖于任何特定类型的网络或IP。一个简单的套接字是通过一个系统调用创建的。这个调用就像函数调用一样,里面有三个参数:Domain、type和protocol。所有这些参数的值和返回的值都是整数数据类型。参数中的域部分包含了类似AF_INET(IP)的地址族。而在IP6的情况下则是AF_INET6,但默认情况下是选择IPv4。这就是套接字编程和inet_pton相互关联的方式。

语法

# int inet_pton(int af, const character *sourc, void *dst);

该语法包括输入参数,"src "指的是源,并且是空尾的。它指的是传递给它的字符串。第二个参数'dst'指向缓冲区,该缓冲区是inet_pton()在转换后存储的数字地址的存储器。系统调用者确保缓冲区的存储能力。它确保 "dst "所分配的缓冲区足够大,以容纳数字地址。

在使用Inet_pton的情况下,第三个参数是最基本的。当Af_INET是家族参数时,那么该参数指向IPv4地址的文本表示法,即点状十进制符号,这是一个标准。在AF_INET6的情况下,该参数指向标准符号的IPv6文本表示法。在AF_INET的情况下,缓冲区应该能够容纳IN_ADDR结构。而在AF_INET6的情况下,IN6_ADDR。

地址的点阵十进制符号是xxx.xxx.xxx.xxx.,其中'xxx'是1到3位的十进制数字,范围在0到255之间。在AF_INET6的情况下,"src "字符串必须包含下面提到的标准IPv6术语。

首选的格式包含地址的8、16位片断的十六进制值。应避免使用零作为前导值。但在每个字段中,必须有一个数字值。

有一串零的地址可以用 "as: "表示。符号":: "应在整个地址中使用一次。未指定的地址应写成"::"。

在处理IPV4和IPv6的混合环境时,第三种形式很容易实现,即x:x:d.d,以此类推。

返回的类型/值

如果程序成功,inet_pton()返回值为1,然后将互联网地址的二进制格式的地址存储在 "dst "分配的缓冲区的特定点中。如果函数不成功,则返回0,但只有当 "src "指向的输入缓冲区是一个无效的字符串时,inet_pton()函数才会返回0。函数不成功的第二种情况是-1,因为参数未知,所以返回一个负值,并设置 "errno"。为了扩展错误信息,可以通过调用WSAGetLastError获得具体的错误代码。

错误可以有两种可能。例如,第一个属于被指定的地址族的是不支持的。如果指定的家族参数不是AF_INET,就会返回这个错误。第二个是空的,或者不属于用户的地址空间。

Inet_pton()的实现

inet_pton()函数的描述也可以在Linux终端上通过手册页获得。你可以通过简单地使用以下命令来访问它。

$ man inet_pton

例子1

这个例子演示了init_pton在C语言编程中的用法。在实现之前,让我提一下我们在这里使用的工具。我们是在Linux环境下实现源代码的。我们将使用Ubuntu文本编辑器来编写代码,使用Ubuntu终端来执行文件并显示结果值。

像其他所有的源代码一样,该程序以库为起点。除了arpa/inet.h之外,所有的库都是众所周知和常用的。

#include <arpa/inet.h>

使用这个头文件的目的是为了包含所有互联网操作的定义。

一个IP地址在主程序中被作为一个常数字符提到。inet_pton()函数将接收家族、IP地址和源名称。这里我们使用了一个开关语句,根据与输出值有关的选项在程序中移动。如果该值是正数,那么亲切地显示转换后的地址。在转换之前,特定的缓冲区被释放或创建,如上所述。转换后的二进制格式地址被放置在那里。在第二种情况下,如果函数的返回值为0,说明没有找到匹配的地址。而对于第三种情况,当结果值为-1时,将创建一个错误并通知。

写完代码后,将源代码保存在带有C语言扩展名的文件中。现在在终端执行该代码。为此使用gcc编译器,"pton.c "是一个文件的名称。

$ gcc –o pton pton.c
$ ./pton

结果显示,程序中使用的地址被转换为具有字母和数字值的二进制值。

例2

这个例子也是用同样的概念显示地址,但实现方式不同。但是这一次,我们采取了两个地址,一个用于INET,一个用于INet6。如果没有提到INET或缓冲区的数字,那就是针对Buf6的,因为它是默认选择的。

两个变量将包含地址作为参数。同样地,两个缓冲区被分配为释放,以便在转换后获取地址。这里使用了If-else语句。前两种可能性是指因为0和负值而发生的错误。Buf6用于存储转换后的地址。Inet6在这里用于IPv6。现在来看看结果,到终端去看看。

结果值显示,inet6_pton以二进制形式显示地址。根据规则,'::'表示一个未识别的地址,现在用一个双冒号代替。

结论

这篇文章 "INET_pton函数的例子是在Ubuntu Linux操作系统中用C语言实现的。我们通过描述语法和函数内部作为参数使用的参数,解释了这个函数的工作。还强调了一些发生的错误,并通过返回值进行了观察。为了消除对Init_pton()函数的目的和用法的任何歧义,我们详细解释了例子。