使用AF_UNSPEC会有哪些缺点/风险?

Kir*_*rov 8 c c++ unix sockets network-programming

Beej的网络编程指南

您可以强制它在ai_family字段中使用IPv4或IPv6,或将其保留为AF_UNSPEC以使用任何内容.这很酷,因为您的代码可以与IP版本无关.

正如标题所说 - 总是使用的缺点(或风险,如果有的话)AF_UNSPEC,而不是指定IPv4或IPv6?

或者只是出于一个原因 - 如果指定了版本,这将保证只支持此版本吗?


一点背景 - 我考虑在客户端 - 服务器(C++)应用程序中添加对IPv6的支持,并且应该支持这两个版本.所以我想知道它是否可以使用,AF_UNSPEC或者最好"识别"字符串中的地址并使用AF_INET6AF_INET取决于地址.

glg*_*lgl 5

您必须区分客户端和服务器应用程序。

在客户端,这很容易:只需getaddrinfo()按顺序调用并尝试每个答案,直到获得连接。

在服务器上,事情有点难:

  • 有些系统的 IPv4 和 v6 堆栈是相互连接的,在那里只监听 IPv6 就足够了。也许必须启用套接字才能收听两者。
  • 其他系统(如 Windows XP)具有无法进行此连接的分离堆栈。在那里,您必须同时使用多个套接字。让我专注于以下内容。

即使在服务器上,getaddrinfo()也可以使用。在那里你使用AI_PASSIVE提示中的标志。然后你就会得到结果。关于这些,你必须听,也许启用IPV6_V6ONLY标志。

accept()应该以非阻塞方式完成或使用select()poll()(不确定后者是否可能)。