C addrinfo结构中的ai_next和ai_addr的用途
我在自学socket编程,最近遇到了C addrinfo结构中的ai_next和ai_addr的用途,c,sockets,struct,C,Sockets,Struct,我在自学socket编程,最近遇到了getaddrinfo和addrinfo结构。根据我的理解,结构中的大多数文件都是INT,可以通过指定宏来使用,例如,如果我想在我的addrinfo结构中AF\u INET,我会指定AF\u INET,或者整数2(我不确定这一点,它在哪个头文件中声明?)。 我不太明白为什么会有一个sockaddr和指向另一个addrinfo的指针。有人告诉我,后者创建了一个链表,但它背后的目的是什么 我建议始终使用类型名指定值。它们在不同的系统上可能不同 描述了 ADDReF
getaddrinfo
和addrinfo
结构。根据我的理解,结构中的大多数文件都是INT,可以通过指定宏来使用,例如,如果我想在我的addrinfo
结构中AF\u INET
,我会指定AF\u INET
,或者整数2(我不确定这一点,它在哪个头文件中声明?)。
我不太明白为什么会有一个sockaddr和指向另一个addrinfo的指针。有人告诉我,后者创建了一个链表,但它背后的目的是什么 我建议始终使用类型名指定值。它们在不同的系统上可能不同
描述了<代码> ADDReFielsStutt的字段,但要总结链接列表的工作方式,请考虑此代码:
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));
}
从
getaddrinfo
返回的addrinfo*
可能指向另一个,这可能指向另一个,依此类推。这就是它如何表示可以解析为多个不同IP的地址(用于负载平衡、双栈IPv4/IPv6等)。我建议始终使用类型名称指定值。它们在不同的系统上可能不同
描述了<代码> ADDReFielsStutt的字段,但要总结链接列表的工作方式,请考虑此代码:
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));
}
从
getaddrinfo
返回的addrinfo*
可能指向另一个,这可能指向另一个,依此类推。这就是它如何表示可以解析为多个不同IP的地址(用于负载平衡、双栈IPv4/IPv6等)。好的,主要问题是“它背后的原因是什么?”。原因是,一台主机可能分配了多个internet地址。例如,如果您运行“host www.google.com”命令,这将为您提供多个internet地址,因此多个addrinfo的链接列表的要点是保留所有返回的internet地址,从而允许您正确转换网络地址和服务
当您编写应用程序并尝试连接到可能有多个internet地址的公共服务器时,这些地址链接列表将使您能够灵活地连接到适当的接口。好的,主要问题是-“背后的原因是什么?”。原因是,一台主机可能分配了多个internet地址。例如,如果您运行“host www.google.com”命令,这将为您提供多个internet地址,因此多个addrinfo的链接列表的要点是保留所有返回的internet地址,从而允许您正确转换网络地址和服务
当您编写应用程序并尝试连接到可能有多个internet地址的公共服务器时,这些地址链接列表将使您能够灵活地连接到适当的接口。
struct addrinfo
提供两种情况:第一种情况:将提示传递到getaddrinfo()
关于来电者感兴趣的内容。如果需要通过多个选择标准,可以使用next
-成员将节点添加到列表中。第二种情况:减少由getaddrinfo()
返回的结果。结果可能不止一个IP地址,如果是这样,则使用next
-成员链接到下一个结果(如下面Kyle Lemon的回答中所述)。然而,阅读友好的手册肯定也会有助于获得启发。你不应该依赖AF\u INET
的值为2
,因为标准不需要特定的值。唯一的要求是AF_INET
、AF_INET6
、AF_UNIX
和AF_unsec
都有不同的值。见和。(更不用说,使用标准提供的符号常量的值而不是符号常量本身的唯一可能理由是拼写。)struct addrinfo
提供两种情况:第一种情况:向调用方感兴趣的内容传递提示。如果需要通过多个选择标准,可以使用next
-成员将节点添加到列表中。第二种情况:减少由getaddrinfo()
返回的结果。结果可能不止一个IP地址,如果是这样,则使用next
-成员链接到下一个结果(如下面Kyle Lemon的回答中所述)。然而,阅读友好的手册肯定也会有助于获得启发。你不应该依赖AF\u INET
的值为2
,因为标准不需要特定的值。唯一的要求是AF_INET
、AF_INET6
、AF_UNIX
和AF_unsec
都有不同的值。见和。(更不用说,使用标准提供的符号常量的值而不是符号常量本身的唯一可能理由是拼写的。)因此,这些多个IP地址指向同一个网站,但它们到底是什么?镜子?可能是。这取决于基础设施是如何实现的。像谷歌这样的服务通常有多个互联网地址。所以,这些多个IP地址指向同一个网站,但它们到底是什么?镜子?可能是。这取决于基础设施是如何实现的。像谷歌这样的服务通常都有多个互联网地址。谢谢你们的回复,现在更好地理解了。然而,我有一个稍微离题的问题。在for循环中使用省略号。我知道这意味着变量的数量可能会有所不同,但是,当在for循环中使用时,我并不是100%理解它。这就是我说“这里缺少代码”的方式。特别是,在中使用它之前,需要调用getaddrinfo
并检查返回值/errno