unity增加對IPv6的支持


本文轉自: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 );
        }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM