【发布时间】:2016-06-06 16:16:53
【问题描述】:
我们正在更新我们的套接字代码,以处理您需要能够在纯 IPv6 环境中连接的新 iOS 要求。
我们目前正在使用 .NET 套接字和 TcpClient。
我正在尝试建立一个 IPv6 和 IPv4 都可以工作的解决方案,但到目前为止什么都没有发生。
如果我使用:
TcpClient client = new TcpClient();
client.BeginConnect( "server.hostname.com", 8182, this._onConnect, client );
在 IPv6 环境中,我没有得到响应; _onConnect 方法永远不会被触发。
如果我使用:
TcpClient client = new TcpClient( AddressFamily.InterNetworkV6 );
client.BeginConnect( "server.hostname.com", 8182,this._onConnect, client);
我收到SocketException:
An address incompatible with the requested protocol was used (errorCode: 10047, socketErrorCode: AddressFamilyNotSupported, nativeErrorCode: 10047)
这很烦人,如果可以理解的话。如果我使用:
TcpClient client = new TcpClient( AddressFamily.InterNetworkV6 );
client.BeginConnect( "xxxx:xxxx:xxxx::xxxx:xxxx", 8182,this._onConnect, client);
然后我可以连接,但是:
- 我现在输入的是原始 IP 地址而不是主机名,这不好
- 这将不再适用于 IPv4 环境
所以我想我可以从主机名中获取支持的 IP,并尝试一个接一个地连接。
使用此代码:
IPHostEntry hostInfo = Dns.GetHostEntry( "server.hostname.com" );
foreach(IPAddress ip in hostInfo.AddressList)
Debug.Log( "Ip: " + ip.ToString() + ": address family: " + ip.AddressFamily );
它只会打印出 IPv4 IP,这不是很有帮助。
我在这里做错了什么?如何从字符串主机名中获取 IPv6 IP?或者有没有更好的方法来解决这个问题?
我有点假设这会在 DNS 级别自动解析,但我猜 Unity 中包含的 Mono 版本不够最新。
谢谢
【问题讨论】:
-
是.Net自带的
System.Net.Sockets.TcpClient类(我认为Unity在.Net 2.0上):msdn.microsoft.com/en-us/library/…