getaddrinfo:如果指定了nodename,AI_PASSIVE会以什么方式被忽略?

时间:2015-01-07 21:52:36

标签: c++ c sockets networking posix

引用getaddrinfo的规格:

  

如果指定了AI_PASSIVE标志,则返回的地址信息应适合用于绑定套接字以接受指定服务的传入连接。在这种情况下,如果nodename参数为null,则套接字地址结构的IP地址部分应设置为INADDR_ANY(IPv4地址)或IN6ADDR_ANY_INIT(IPv6地址)。 / p>

这是有道理的。如果您指定AI_PASSIVE,则可以在返回的地址上bind() / listen() / accept()。如果nodename为空,则返回的地址将绑定到所有网络接口,以便您可以使用任何计算机的IP地址(例如,以太网LAN IP,Wi-Fi LAN IP,环回地址等)。摘要:在服务器上使用AI_PASSIVE(对于TCP套接字)。

继续:

  

如果未指定AI_PASSIVE标志,则返回的地址信息应适合于呼叫connect()(对于连接模式协议)或对connect()的呼叫, sendto()sendmsg()(对于无连接协议)。在这种情况下,如果nodename参数为null,则套接字地址结构的IP地址部分应设置为环回地址。

这也是有道理的。如果您指定AI_PASSIVE,则可以在返回的地址上connect() / sendto() / sendmsg()。如果nodename为null,则获取环回地址。摘要:在客户端上使用AI_PASSIVE(对于TCP套接字)。

继续:

  

如果AI_PASSIVE参数不为空,则应忽略nodename标志。

咦? 忽略 AI_PASSIVE标志甚至意味着什么?从前两个引号中,听起来AI_PASSIVE仅用于确定您是否获得适合服务器/客户端使用的地址,并且在这两种情况下,它听起来像一个空nodename只是给你一个INADDR_ANY地址(用于服务器)或环回地址(用于客户端)。 忽略 AI_PASSIVE标志有什么用呢?

这最后一句话的真正含义是什么?它如何影响前两个引号?

1 个答案:

答案 0 :(得分:3)

gettaddrinfo(2)的Linux联机帮助页描述略有不同(并且更加一致):

  

如果 hints.ai_flags 中指定了 AI_PASSIVE 标志,并且 node 为NULL,则返回的套接字地址将适合< strong> bind (2)一个接受(2)连接的套接字。返回的套接字地址将包含“通配符地址”[...]。如果 node 不为NULL,则忽略 AI_PASSIVE 标志。

     

如果 hints.ai_flags 中未设置 AI_PASSIVE 标志,则返回的套接字地址将适用于连接(2) ),发送(2)或 sendmsg (2)。如果 node 为NULL,则网络地址将设置为回送接口地址[...]。

当然,除了Linux之外,Linux手册页不具有权威性,但我将其作为一种广泛使用的解释提供。特别要注意的是,只有当AI_PASSIVE被赋予并且 节点为NULL时,它才会指定您获得服务器套接字。对于“忽略”AI_PASSIVE意味着什么仍然存在一些含糊之处,但我认为它仍然指向Linux的解释:如果 node 不是,那么总是得到适合客户端套接字的地址信息NULL。

你也许可以这样理解它:“AI_PASSIVE标志应该被忽略”应解释为“如果设置了AI_PASSIVE标志,则该事实应被忽略”。也就是说,它应该被处理,好像没有设置标志。我认为这另外得到了以下事实的支持:当设置AI_PASSIVE时,此声明与行为描述相同(在官方文档中,不仅仅是Linux联机帮助页)。