C 带一个插座的双堆栈
我正在开发双堆栈客户机-服务器通信。我是古玩: 我必须打开两个套接字吗?一个用于IPv4,另一个用于IPv6,或者有一个选项可以打开IPv6的套接字,它将能够同时使用IPv4和IPv6连接? 例如,如果我像这样打开一个插座: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
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,您正在关闭该选项可能重复的