家庭可以获得什么地址回复?

时间:2013-08-23 16:02:28

标签: macos sockets unix winsock

当我使用getaddrinfo致电AF_UNSPEC时,它理论上可以返回它喜欢的任何地址系列:AF_INETAF_INET6,可能是AppleTalk,蓝牙,数据链接,netlink地址。 ..

实际上,它只会在大多数平台上返回AF_INETAF_INET6

  • 在FreeBSD上,它只能返回AF_INETAF_INET6(在源代码中检查)
  • 在linux上,同上(根据glibc手册页)
  • 在Windows上,类似地," ai_family的AF_UNSPEC值表示呼叫者只接受AF_INET和AF_INET6地址系列。" [MSDN, getaddrinfo]

其他系统怎么样?是否存在我们可能获得其他地址结构的平台?

我对MacOS特别怀疑 - 来自opensource.apple.com/source/Libc的消息来源似乎没有,并且该联机帮助没有说。我们有一个来自Mac测试运行的不可重现的日志文件,可能表示getaddrinfo返回了一些其他地址系列。我们支持的其他平台是AIX,Solaris,HP-UX。

我知道我可以检查返回结构中的系列。我无法猜测可能需要使用哪些有趣的字符串和提示来获得非AF_INET(6)结果。

3 个答案:

答案 0 :(得分:1)

不保证任何形式。当我发明了自己的协议并分配了一个号码(本地),并且我的协议可以解析您的程序提供的名称时,允许为我的地址系列返回sockaddr

基本上,如果你通过AF_UNSPEC,你可以做以下两件事之一:

  1. 危险地生活,假设PF_*常量映射到AF_*常量,创建该类型的套接字并连接它,为您的自制协议提供即时支持,或者更好

  2. 忽略任何具有您不理解的地址系列的结果,然后继续下一个。

  3. 您需要注意,很可能查找名称但没有所需类型的地址。使用AF_UNSPEC进行查找时,您将获得正的查找结果,并且需要自己创建错误条件。

    由于应用程序的理想行为是在第一个结果不起作用的情况下依赖于其他结果(考虑使用服务器故障的DNS循环),这可以通过迭代结果直到一个成功并且调整错误原因(即以“无所需类型的地址”开头,如果找到并且连接失败,请切换到“目标无法访问”)。

答案 1 :(得分:0)

POSIX说“如果提示点的ai_family字段具有值AF_UNSPEC,则应返回地址以用于可与指定的节点名和/或服务名一起使用的任何地址族。” (POSIX getaddrinfo(3))和“a__family的AF_UNSPEC值表示调用者应接受任何地址族。”

事实上,即使是linux手册页与你所说的完全不符:“IPv4或IPv6,例如”; OpenBSD说“当ai_family                     设置为PF_UNSPEC,表示调用者将接受任何                     操作系统支持的协议族。“所以我认为它只是意味着什么”(与其他参数兼容)。

我真的不知道应该通过什么字符串getaddrinfo,抱歉。

答案 2 :(得分:-1)

可以返回的AF_ *值的范围仅受结构类型的大小限制。自定义驱动程序/网络返回自己的地址是完全合法的。当然,您只能使用标题来匹配任意值,以便了解使用特定端点的语义。

虽然您可以尝试创建所有可能的AF_ *符号的总枚举,但没有定义其值的标头以匹配OS驱动程序用于指定该协议的标识,这些名称毫无意义。以下是我发现的一些内容:

AF_IPX,AF_APPLETALK,AF_NETROM,AF_BRIDGE,AF_AAL5,AF_X25,AF_BRIDGE,AF_BLUETOOTH,AF_DECnet,AF_ATMPVC,AF_ROSE,AF_NETBEUI,AF_NETLINK,AF_ASH,AF_ECONET,AF_ATM_SVC,AF_SNA,AF_IRDA,AF_PPPOX,AF_WANPIPE,AF_LLC等等,等等

Linux,作为linux,其中大部分都在socket.h中,但这些值不能保证在该内核和那些驱动程序之外有效。