双插头,带一个插座

时间:2014-02-27 17:05:57

标签: c sockets ipv6 ipv4

我正在开发双栈客户端 - 服务器通信。我很好奇:   我是否必须打开两个套接字 - 一个用于IPv4和一个IPv6,或者有一个选项可以为IPv6打开套接字,它可以同时使用IPv4和IPv6连接吗?   例如,如果我打开这样的套接字:

  SOCKET sock = socket(AF_INET6, SOCK_STREAM, 0);

然后致电

 int mode = 0;
  setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&mode, sizeof(mode));

它是否同时接受IPv4和IPv6连接?如果它会接受它,我应该修改后续调用,定义套接字族,然后根据该系列进行操作吗?   类似的东西:

  if (addr->ss_family == AF_INET)
  {

  }
  else if (addr->ss_family == AF_INET6)
  {

  }

先谢谢。

1 个答案:

答案 0 :(得分:3)

如果关闭IPV6_V6ONLY,您将在同一个套接字上获得IPv6和IPv4映射的IPv6连接。因此,您只需要打开一个插槽。

将其显式设置为您想要的值是一个非常好的主意,因为默认值在操作系统之间变化,甚至在Linux内核版本之间也是如此。 (在Linux中,它当前默认为关闭,但之前默认为打开。)

请注意,IPv4映射的IPv6地址将以字符串格式显示,并带有前导::ffff:,例如::ffff:203.0.113.47。您的应用程序需要能够处理此问题。