繁体   English   中英

应该在connect()中使用哪个addrinfo结构?

[英]Which addrinfo struct should be used in connect()?

我正在编写一个程序,可以连接到不同的网站,请求和下载网页。 我这样做很大程度上是为了学习和正确理解网络编程。 我想知道getaddrinfo返回的类型struct addrinfo的链接列表的指针是否以任何特定顺序排列,如果是这样,选择以任何方式连接到物质的ip地址。

例如,如果我运行getaddrinfo("google.com", "http", &hints, &res) ,则res有时最多会有七个互联网地址。 如果我连接到第一个或最后一个,它会以任何方式产生影响吗? 请注意,我已经研究了这个功能的手册页,据我了解,我的问题没有在那里得到解答。

由于您在链表中组织了多个addrinfo结构,因此您应该迭代它并尝试connect直到连接成功。 那是:

struct addrinfo *ptr = res;

while (res != NULL) {
     int rc = connect(socket_fd, (sockaddr *) ptr->ai_addr, ptr->addr_len);
     if (rc == 0) 
         break; // we managed to connect successfully
     // handle error

这可能是必需的,因为DNS查找可以返回多个条目,因此需要具有链接列表以允许您访问它们。 如果connect成功,你就完成了; 如果失败,你应该继续尝试查找返回的每个可用IP,从而将指针推进到下一个元素。 此外,考虑到connect可能由于多种原因而失败,因此您需要检查errno是否存在可能允许进一步尝试的错误。 正如@R ..指出的那样,你也必须通过connect一个新的套接字,因为地址族可能会改变,释放前一个; getaddrinfo将帮助您,因为addrinfo节点( ai_family )中提供了此信息。

但是,这通常是不必要的 :第一个结果通常会起作用。 就个人而言,如果可以的话,我从来没有遇到过遍历链表的需要,但是如果你可能需要的话,它仍然是很好的。

的getaddrinfo(3)

链表可能具有多个addrinfo结构的原因有多种,包括:网络主机是多宿主的,可通过多种协议访问(例如,AF_INET和AF_INET6); 或者多个套接字类型可以使用相同的服务(例如,一个SOCK_STREAM地址和另一个SOCK_DGRAM地址)。 通常,应用程序应尝试按返回顺序使用地址。 getaddrinfo()中使用的排序函数在RFC 3484中定义; 通过编辑/etc/gai.conf(从glibc 2.5开始可用),可以为特定系统调整顺序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM