本文轉自:http://blog.csdn.net/huutu/article/details/52155885
其實ipv4與ipv6之間的區別在建立socket時就有不同:
ipv4的socket:socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
ipv6的socket:socket = new Socket(AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp);
然后我們在建立socket的時候要判斷用戶的當前網絡類型是ipv4還是ipv6。
這里要說到Unity 新增的對IPV6的支持。
其中之一就是 Dns.GetHostAddress 。
如下代碼:
IPAddress[] address=Dns.GetHostAddresses("test.thisisgame.com.cn");
如果當前是 IPV6 的網絡環境,這個函數會返回一個 IPV6 地址,如64:ff9b::7237:5342。
如果當前是 IPV4 的網絡環境,這個函數會返回一個 IPV4 地址,如 127.0.0.1。
接下來判斷 IPAddress 的 AddressFamily來確定當前的網絡環境。
address[0].AddressFamily==AddressFamily.InterNetworkV6
這樣就可以判斷是IPV6 還是 IPV4了。
public static string CheckNetWorkVersion( string nHostString )
{
string nTargetIPString = "www.baidu.com";
IPAddress[] address=Dns.GetHostAddresses( nTargetIPString );
if ( address [0].AddressFamily == AddressFamily.InterNetworkV6 )
{
Debug.LogError ( "[ socket network ]------ipv6------" );
mIsInIp4 = false;
}else if(address [0].AddressFamily == AddressFamily.InterNetwork ){
Debug.LogError ( "[ socket network ]------ipv4------" );
}
string nOutHost = nHostString;
//如果是ipv6 網絡
if (!mIsInIp4) {
System.Net.IPHostEntry host;
try {
host = System.Net.Dns.GetHostEntry ( nHostString );
foreach (System.Net.IPAddress ip in host.AddressList) {
if (ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6) {
nOutHost = ip.ToString();
break;
}
}
} catch (Exception e) {
Debug.LogErrorFormat ("[ socket network ] error , GetIPAddress error: {0}", e.Message);
}
}
Debug.LogError ("[ socket network ] --- ip addr --- " + nOutHost );
mConnectSvrUrl = nOutHost;
return nOutHost;
}
public void connect( ConnectVars nVars )
{
if (mNetCallback == null) {
return;
}
// Debug.LogError ( "-----------connect-----------");
mLinkState = true;
mConnectInfo = nVars;
Debug.LogError ( "-----------mIsInIp4-----------" + mIsInIp4 + " /" + mConnectInfo.serverAddress);
if ( mIsInIp4 ) {
mSocEntity = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
} else {
mSocEntity = new Socket (AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp);
}
mReadBuffer = new byte[ 4096 ];
if ( null == mSocEntity )
return ;
mNetCallback.onRecvMessage ( FiEventType.CONNECT_START , null , 0 );
Debug.Log ("[ "+TAG+" ] server ip ="+mConnectSvrUrl+" server port="+mConnectInfo.serverProt);
IPEndPoint nEndPoint = new IPEndPoint (IPAddress.Parse ( mConnectSvrUrl ), mConnectInfo.serverProt);
mSocEntity.BeginConnect ( nEndPoint, new System.AsyncCallback( OnSocketConnected ) , mSocEntity );
}