引用getaddrinfo的规范
如果指定了
AI_PASSIVE标志,则返回的地址信息应适合用于绑定用于接收指定服务的传入连接的套接字。在这种情况下,如果nodename参数为null,则套接字地址结构的IP地址部分将设置为INADDR_ANY作为IPv4地址,IN6ADDR_ANY_INIT设置为IPv6地址。
这说得通。如果指定了bind()/listen()/accept(),则可以对返回的地址进行AI_PASSIVE。如果nodename为null,则返回的地址绑定到所有网络接口,以便您可以使用计算机的任何IP地址(例如以太网LAN IP、Wi IP、回送地址等)。摘要:在服务器上使用AI_PASSIVE (对于TCP套接字)。
继续:
如果未指定
AI_PASSIVE标志,则返回的地址信息应适用于对connect()的调用(对于连接模式协议)或对connect()、sendto()或sendmsg()的调用(对于无连接协议)。在这种情况下,如果nodename参数为null,则套接字地址结构的IP地址部分将设置为回送地址。
这也是有道理的。如果您的connect()/sendto()/sendmsg()不指定AI_PASSIVE,则可以对返回的地址进行。如果nodename为null,则得到环回地址。摘要:不在客户机上使用AI_PASSIVE (对于TCP套接字)。
继续:
如果
AI_PASSIVE参数不是null,则将忽略nodename标志。
哈?忽略AI_PASSIVE标志意味着什么?从前两个引号看,AI_PASSIVE只用于确定您是否获得了适合服务器/客户端使用的地址,在这两种情况下,它听起来像是空nodename只给您一个INADDR_ANY地址(用于服务器)或环回地址(用于客户端)。忽略AI_PASSIVE标志有什么好处?
这最后一句到底是什么意思?它如何影响前两个引号?
发布于 2015-01-07 22:52:39
gettaddrinfo(2)的Linux手册对它的描述略有不同(并且更加一致):
如果AI_PASSIVE标志是在hints.ai_flags中指定的,且节点为NULL,则返回的套接字地址将适合于对将接受(2)连接的套接字进行绑定(2)。返回的套接字地址将包含“通配符地址”.如果节点不是NULL,则忽略AI_PASSIVE标志。 如果AI_PASSIVE标志未在hints.ai_flags中设置,则返回的套接字地址将适合与connect(2)、sendto(2)或sendmsg(2)一起使用。如果节点为NULL,则网络地址将被设置为回送接口地址.
当然,除了Linux之外,Linux手册并不是权威的,但是我提供它作为一个广泛使用的解释。特别要注意的是,它指定只有当AI_PASSIVE被赋予且节点为NULL时才能获得服务器套接字。这仍然给“忽略”AI_PASSIVE的含义留下了一些模糊的含义,但我认为它还是指向了Linux的解释:如果节点不是NULL,则始终获得适合客户端套接字的地址信息。
您也许可以这样对其进行合理化:“AI_PASSIVE标志将被忽略”应该解释为“如果设置了AI_PASSIVE标志,那么这个事实将被忽略”。也就是说,它的处理应该像没有设置国旗一样。我认为这一点也得到了支持,因为这个语句出现在同一个段落中,描述了设置AI_PASSIVE时的行为(在官方文档中也是如此,而不仅仅是在Linux中)。
https://stackoverflow.com/questions/27829275
复制相似问题