C语言 带一个插槽的双堆栈



我正在开发双栈客户端-服务器通信。我是好奇心: 我是否必须打开两个套接字 - 一个用于 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 中,它目前默认为 off,但以前默认为 on。

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

相关内容

最新更新