我正在自学套接字编程,最近遇到了getaddrinfo
和addrinfo
结构。据我了解,结构中的大多数文件都是可以通过指定宏使用的int,例如,如果我想在AF_INET
结构中使用addrinfo
,则可以指定AF_INET
或整数2(我不肯定知道这一点,它声明在哪个头文件中?)。
好吧,我认为我不太明白为什么会有一个sockaddr和指向另一个addrinfo的指针。有人告诉我后者创建了一个链表,但是它的目的是什么?
最佳答案
我建议始终使用类型名称指定值。在不同的系统上,它们可能有所不同。
getaddrinfo(3) man page描述了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等)的地址的方式。