我正在自学套接字编程,我最近遇到getaddrinfo
了addrinfo
结构。据我了解,结构中的大多数文件都是整数,您可以通过指定宏来使用,例如,如果我想AF_INET
在我的addrinfo
结构中使用,我会指定AF_INET
或整数 2(我不知道这个当然,它在哪个头文件中声明?)。好吧,我想我不太明白为什么会有一个 sockaddr 和指向另一个 addrinfo 的指针。有人告诉我后者创建了一个链表,但它背后的目的是什么?
问问题
4970 次
2 回答
4
好的,主要问题是 - “它背后的原因是什么?”。原因是,一台主机可能有多个互联网地址分配给它。例如,如果您运行“host www.google.com”命令,这将为您提供多个互联网地址,因此多个 addrinfo 链表的目的是保留所有返回的互联网地址,从而允许您正确翻译网络地址和服务。
当您编写应用程序并尝试连接到可能具有多个 Internet 地址的公共服务器时,这些地址链接列表将使您能够灵活地连接到适当的接口。
于 2013-09-02T07:20:18.160 回答
2
我建议始终使用类型名称指定值。它们在不同的系统上可能不同。
getaddrinfo(3) 手册页描述了结构的字段,addrinfo
但要总结链表的工作方式,请考虑以下代码:
for (struct addrinfo *ai = ...; ai != NULL; ai = ai->ai_next) {
printf("address: %s -> %s\n", ai->ai_canonname,
inet_ntop(ai->ai_family, ai->ai_addr, buf, buflen));
}
addrinfo*
你返回的可能getaddrinfo
指向另一个,它可能指向另一个,依此类推。这就是它表示一个地址的方式,该地址可以解析为多个不同的 IP(用于负载平衡、双栈 IPv4/IPv6 等)。
于 2013-09-02T05:08:10.537 回答