C 带一个插座的双堆栈

C 带一个插座的双堆栈,c,sockets,ipv6,ipv4,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, s

我正在开发双堆栈客户机-服务器通信。我是古玩: 我必须打开两个套接字吗?一个用于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\u V6ONLY,您将在同一个套接字上获得IPV6和IPv4映射的IPV6连接。因此,您只需打开一个插座

将其显式设置为所需的值是一个非常好的主意,因为默认值在操作系统之间,甚至在Linux内核版本之间都有所不同。(在Linux中,它当前默认为关闭,但以前默认为打开。)


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

如果您关闭
IPV6\u V6ONLY
,您将在同一套接字上同时获得IPV6和IPv4映射的IPV6连接。因此,您只需打开一个插座

将其显式设置为所需的值是一个非常好的主意,因为默认值在操作系统之间,甚至在Linux内核版本之间都有所不同。(在Linux中,它当前默认为关闭,但以前默认为打开。)


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

如果您关闭
IPV6\u V6ONLY
,您将在同一套接字上同时获得IPV6和IPv4映射的IPV6连接。因此,您只需打开一个插座

将其显式设置为所需的值是一个非常好的主意,因为默认值在操作系统之间,甚至在Linux内核版本之间都有所不同。(在Linux中,它当前默认为关闭,但以前默认为打开。)


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

如果您关闭
IPV6\u V6ONLY
,您将在同一套接字上同时获得IPV6和IPv4映射的IPV6连接。因此,您只需打开一个插座

将其显式设置为所需的值是一个非常好的主意,因为默认值在操作系统之间,甚至在Linux内核版本之间都有所不同。(在Linux中,它当前默认为关闭,但以前默认为打开。)


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

在快速google IPV6\u V6ONLY似乎将其设置为仅接受v6之后。通过将模式传递为0,您将关闭该选项快速google IPV6\u V6ONLY似乎将其设置为仅接受v6之后的可能副本。通过将模式传递为0,您正在关闭该选项快速google IPV6_v6仅将其设置为仅接受v6。通过将模式传递为0,您正在关闭该选项快速google IPV6_v6仅将其设置为仅接受v6。通过将模式传递为0,您正在关闭该选项可能重复的