2

当我用 调用getaddrinfoAF_UNSPEC,理论上它可以返回它喜欢的任何地址族:AF_INETAF_INET6,也许是 AppleTalk,蓝牙,数据链路,网络链路地址......

在实践中,它只是返回AF_INET并且AF_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) 结果。

4

3 回答 3

1

没有任何形式的保证。当我发明了自己的协议并分配了一个数字(本地),并且我的协议可以解析您的程序给出的名称时,允许sockaddr为我的地址族返回一个。

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

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

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

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

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

于 2013-09-04T17:30:38.883 回答
0

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

事实上,即使是 linux 联机帮助页也不完全符合您所说的:“例如IPv4 或 IPv6 ”;OpenBSD 说“当 ai_family 设置为 PF_UNSPEC 时,这意味着调用者将接受操作系统支持的任何协议族。”,所以我认为它只是意味着“随便”(与其他参数兼容)。

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

于 2013-09-04T16:49:09.687 回答
-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_PPPOXPE等

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

于 2013-09-05T08:38:03.337 回答