【发布时间】:2019-05-13 19:35:04
【问题描述】:
有similar questions,但我找不到我正在寻找的答案。
#include <netdb.h>
int getaddrinfo (const char *hostname,
const char *service,
const struct addrinfo *hints,
struct addrinfo **result) ;
Returns: 0 if OK, nonzero on error
我想知道为什么我们确实需要对result 指向的链表进行迭代,即使我们定义了hints 而不是NULL。我们已经知道IP(主机名)和PORT(服务)。不是吗?
如果需要迭代,您能否简单地通过考虑一个没有完整网络知识的人来举例说明?
例如,我定义hints如下。
struct addrinfo hints;
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC; /* IPv4 or IPv6 */
hints.ai_socktype = SOCK_STREAM; /* TCP */
hints.ai_flags = 0;
hints.ai_protocol = 0;
【问题讨论】:
-
AF_UNSPEC表示您至少可以获得两个结果;一个用于 IPv4,一个用于 IPv6。此外,每个接口可以有多个 IP 地址(多条 A 记录),然后您可以获得更多记录。 -
如果您对第一个结果感到满意,您可以避免迭代,但您不应忽略在接受之前检查该结果。
-
@jww 对于后一种情况,我们是否假设 hostname 参数是字母名称(例如 google.com)而不是数字 IP 地址?例如,在终端 dig A www.google.com 上产生一个 A 记录,但 yahoo.com 产生 6 个 A 记录。 但是假设我们已经将数字 IP 地址而不是字母顺序(例如 yahoo.com)传递给 getaddr() 函数,它不限制自己的 IP 地址吗? 我仍然不明白为什么要迭代示例案例。或者我们是否需要这个例子的迭代?
-
@snr,如果你已经有了数字地址,那你为什么还要打电话给
getaddrinfo?它是一个名称解析接口。 -
@John Bollingerr 先生,这个功能不是同时使用吗?名称和数字。此外,Kerrisk 说这是套接字的当代方法。 ??
标签: c linux sockets getaddrinfo