一个插座双堆栈

2023-12-08

我正在开发双栈客户端-服务器通信。我很好奇: 我是否必须打开两个套接字 - 一个用于 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)
  {

  }

提前致谢。


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

明确地将其设置为您想要的值是一个非常好的主意,因为默认值因操作系统甚至 Linux 内核版本而异。 (在 Linux 中,它当前默认为关闭,但之前默认为打开。)

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一个插座双堆栈 的相关文章

随机推荐