"getaddrinfo",顾名思义,是用来获取地址信息的。 getaddrinfo()用来将一个人类可读的、代表主机名或IP地址的文本字符串转换为一个链接,动态分配给addrinfo结构的链接列表。getaddrinfo()函数翻译了服务位置名称和服务名称。它有一个返回类型,用于返回套接字的地址和一些信息,这些信息可以在创建套接字时用来解决指定的服务。
Getaddirnfo是一个线程安全的函数。此外,它使用DNS协议与配置有IP地址的名称服务器连接。Getaddrinfo()函数被称为调用组合器,因为仅这个函数就调用了100多个系统调用。这个函数也被称为阻塞性调用,因为没有办法轻易指定返回值的时间,所以最终会阻塞调用。
语法
int getaddrinfo (constant character *nodename,
constant character *servname,
constant structure addrinfo *hints,
structure addrinfo **res);
参数
Servname:它是服务器的名称。非NULL的 "servname "可以是一个服务器名称或十进制的端口号。
提示:它是一个指向 "addrinfo "结构的指针,因为它提供了你所支持的插座的提示。
地址:它是一个位置的地址,在这个位置上,函数存储了一个带有一个以上 "addrinfo "结构的链接列表的指针。
关于Getaddrinfo的一般描述
"servername "和 "nodename "参数是指向空尾字符串的指针或空指针。这两个参数或其中一个应被视为非空字符串指针。有效的名称格式取决于协议的族。当没有错误检测发生时,所有家族都被指定,那么所有成功的结果都将被返回。
现在谈一下 "节点名 "和 "服务器名 "的空终止。如果 "servername "为空,所有的调用都会返回特定 "nodename "的网络地址。如果服务器名称不是空的,它被认为是一个以空结尾的字符串,请求服务。它要么是描述性的,要么是适合家庭的数字表示。
另一方面,他们正在谈论提示参数。它显示了包含指导操作的输入值的结构,并通过将返回的信息保持在某种限度内,提供给各自的套接字类型和协议的选项。如果套接字类型的值为0,那么调用者可以接受任何套接字类型。同样地,如果返回的协议值为零,调用者将接受任何像套接字一样的协议。
提示参数的 "addrinfo "结构接受不同类型的socket
比如说:
- 如果它接受任何协议家族,那么这个家族就是ai_family。
- 如果它接受任何套接字类型,那么它使用ai_socktype的家族。
- 如果它接受任何协议,那么它使用ai_protocol。
- 如果接受所有的参数,并将ai_flags安顿为0,那么它使用提示族。
返回值
每次函数返回一个值,它包含主要的三个参数参数:ai_family、ai_socktype和ai_protocol。调用该函数后,我们得到这些参数。在每个addrinfo结构中,一个填入的套接字结构由ai_addr指向,其中套接字地址的长度由ai_addrlen成员识别和指定。
在函数失败的情况下,getaddrinfo()返回一个非零的错误代码。有很多错误代码,如EAI_FAIL、EAI_FAMILY等。
getaddrinfo()函数的实现
我们使用了Linux操作系统。在文本编辑器中编写代码,然后在Ubuntu终端上执行源代码文件。
例子1
这个例子使用getaddrinfo()函数来解决域名www.sample.com 到地址列表中的问题。之后,我们调用getnameinfo()来返回地址的名称。该函数将创建一个原始的主机名,除非多个名称被分配给特定的地址。在一个例子中,我们已经打印了两次以上的域名。对于每一次,都会得到相同的结果。
这个例子将不使用结构。直接用函数来招待主程序。在主程序中,在初始化库之后,我们使用了两个函数变量作为结果值。如果错误不等于零,意味着发生了错误,然后通知 "errno"。
之后,我们将通过主机信息来获取主机名,地址长度也被获取。如果再次发生错误,则确定为错误;另一方面,打印主机名。
用编译器的帮助来编译结果,并在终端上执行。这里使用的编译器是GCC编译器。'file1.c'是一个文件的名称。你可以看到,主机号被显示了三次。
例2
这里将使用所有关于socket的库。在这个函数中,我们将描述具有所有参数信息和数据类型的结构。提示将描述所有的插座、家族和 "soctype"。在这之后,我们应用了像第一个例子那样的检查;如果错误是非零的,它将被纠正。而如果 "getaddeinfo "的结果不是0.那么主机名就是目标,将被显示。
我们使用了一个带有switch语句的while循环来考虑每一种情况,但当达到所需的情况时,该语句就会终止了。"Sockaddr "将通过对IP4使用AF_INET和对IPv6使用AF_INET6来检查每个IP。指针将指向这里使用的地址。这里使用了Inet_ntop()函数,该函数主要用于将IP地址的数字和二进制字符串转换成非常容易阅读的地址的文本字符串。然后关闭该函数。
在主程序内部,使用了一个do-while循环,因为这部分涉及到用户的互动。因此,除非输入正确的域,否则它将一直显示信息。缓冲区被分配了输入数字的长度。一个 "strlen "函数被用来测量长度。如果长度很短,就会发送错误信息,如果长度大于0,就会将输入的信息保存在缓冲区中。
执行并编译代码,然后你会看到系统首先询问域名;如果域名无效,它就会显示无效参数信息。如果是不可用的,它又要求重新输入名称;这个过程一直持续到你输入正确的域名。
结论
这篇文章 "C:getaddrinfo函数的使用 "显示了这个函数的使用以及它的参数,这些参数在获取地址的每个方面都有其功能。getaddrinfo主要处理当前可用的域名。这篇文章展示了getaddrinfo在Linux操作系统中的例子和工作。