我可以理解 和 之间的区别ProtocolType.IPv4
,ProtocolType.IPv6
但我不确定ProtocolType.IP
等式的来源,并且文档并没有真正描述不同值的含义。
我可以IP
每次都使用并假设生成的套接字适用于 IPv4 和 IPv6 地址吗?
ProtocolType.IP 与 ProtocolType.Unspecified 具有相同的基础值,0。枚举值与传递给WSASocket() winapi 函数的协议参数的参数值匹配。其中记录了 0 的含义:
如果指定值 0,则调用者不希望指定协议,服务提供者将选择要使用的协议。
Windows 上的哪个确实是 IP,但可能是 IPv4 或 IPv6,具体取决于机器配置。我会说您通常希望明确说明它,这样您就不必猜测何时出现问题。
当我从一个项目中回忆起它的功能时,你走在了正确的轨道上。使用通用协议表示 IP 地址返回任何 IPv4 或 IPv6 地址,这可以。但是在我们的域中,我们启用了 IPv6 设备,但我们实际上只使用 IPv4,因此 PC 可能会为 IPv6 返回一个十六进制的 IP 地址,但没有任何东西可以单独使用或通信(至少据我所知可靠)所以我被迫退回到 IPv4。现在我只得到 10.xx.xxx.xxx 而不是 10 空格和 IPv6 十六进制地址。
我想你正在寻找这个:
Socket socket
= new Socket(AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp);
socket.SetSocketOption(SocketOptionLevel.IPv6, SocketOptionName.IPv6Only, 0);
这将创建一个可以使用 TCP 处理 IPv4 和 IPv6 的套接字。