Jelajahi Sumber

应该可以支持IPV6了,没有测试,大家自己测试客户端纯IPV6环境吧,有问题再找我现场查看

tanghai 3 tahun lalu
induk
melakukan
2b2c47dc5e

+ 4 - 3
Codes/Hotfix/Client/Demo/Login/LoginHelper.cs

@@ -1,4 +1,5 @@
 using System;
+using System.Net;
 using System.Net.Sockets;
 
 namespace ET.Client
@@ -22,9 +23,9 @@ namespace ET.Client
                         routerAddressComponent = clientScene.AddComponent<RouterAddressComponent, string, int>(ConstValue.RouterHttpHost, ConstValue.RouterHttpPort);
                         await routerAddressComponent.Init();
                         
-                        clientScene.AddComponent<NetKcpComponent, AddressFamily, int>(routerAddressComponent.AddressFamily, CallbackType.SessionStreamDispatcherClientOuter);
+                        clientScene.AddComponent<NetKcpComponent, AddressFamily, int>(routerAddressComponent.RouterManagerIPAddress.AddressFamily, CallbackType.SessionStreamDispatcherClientOuter);
                     }
-                    string realmAddress = routerAddressComponent.GetRealmAddress(account);
+                    IPEndPoint realmAddress = routerAddressComponent.GetRealmAddress(account);
                     
                     session = await RouterHelper.CreateRouterSession(clientScene, realmAddress);
                     {
@@ -37,7 +38,7 @@ namespace ET.Client
                 }
 
                 // 创建一个gate Session,并且保存到SessionComponent中
-                Session gateSession = await RouterHelper.CreateRouterSession(clientScene, r2CLogin.Address);
+                Session gateSession = await RouterHelper.CreateRouterSession(clientScene, NetworkHelper.ToIPEndPoint(r2CLogin.Address));
                 clientScene.AddComponent<SessionComponent>().Session = gateSession;
 				
                 G2C_LoginGate g2CLoginGate = (G2C_LoginGate)await gateSession.Call(

+ 19 - 5
Codes/Hotfix/Client/Demo/Router/RouterAddressComponentSystem.cs

@@ -20,7 +20,7 @@ namespace ET.Client
         
         public static async ETTask Init(this RouterAddressComponent self)
         {
-            self.AddressFamily = NetworkHelper.GetAddressFamily(self.RouterManagerHost);
+            self.RouterManagerIPAddress = NetworkHelper.GetHostAddress(self.RouterManagerHost);
             await self.GetAllRouter();
         }
 
@@ -51,20 +51,34 @@ namespace ET.Client
             await self.GetAllRouter();
         }
 
-        public static string GetAddress(this RouterAddressComponent self)
+        public static IPEndPoint GetAddress(this RouterAddressComponent self)
         {
             if (self.Info.Routers.Count == 0)
             {
                 return null;
             }
 
-            return self.Info.Routers[self.RouterIndex++ % self.Info.Routers.Count];
+            string address = self.Info.Routers[self.RouterIndex++ % self.Info.Routers.Count];
+            string[] ss = address.Split(':');
+            IPAddress ipAddress = IPAddress.Parse(ss[0]);
+            if (self.RouterManagerIPAddress.AddressFamily == AddressFamily.InterNetworkV6)
+            { 
+                ipAddress = ipAddress.MapToIPv6();
+            }
+            return new IPEndPoint(ipAddress, int.Parse(ss[1]));
         }
         
-        public static string GetRealmAddress(this RouterAddressComponent self, string account)
+        public static IPEndPoint GetRealmAddress(this RouterAddressComponent self, string account)
         {
             int v = account.Mode(self.Info.Realms.Count);
-            return self.Info.Realms[v];
+            string address = self.Info.Realms[v];
+            string[] ss = address.Split(':');
+            IPAddress ipAddress = IPAddress.Parse(ss[0]);
+            //if (self.IPAddress.AddressFamily == AddressFamily.InterNetworkV6)
+            //{ 
+            //    ipAddress = ipAddress.MapToIPv6();
+            //}
+            return new IPEndPoint(ipAddress, int.Parse(ss[1]));
         }
     }
 }

+ 3 - 4
Codes/Hotfix/Client/Demo/Router/RouterCheckComponentSystem.cs

@@ -53,10 +53,10 @@ namespace ET.Client
                     localConn = kChannel.LocalConn;
                     remoteConn = kChannel.RemoteConn;
 
-                    string realAddress = self.GetParent<Session>().RemoteAddress.ToString();
+                    IPEndPoint realAddress = self.GetParent<Session>().RemoteAddress;
                     Log.Info($"get recvLocalConn start: {self.ClientScene().Id} {realAddress} {localConn} {remoteConn}");
 
-                    (uint recvLocalConn, string routerAddress) = await RouterHelper.GetRouterAddress(self.ClientScene(), realAddress, localConn, remoteConn);
+                    (uint recvLocalConn, IPEndPoint routerAddress) = await RouterHelper.GetRouterAddress(self.ClientScene(), realAddress, localConn, remoteConn);
                     if (recvLocalConn == 0)
                     {
                         Log.Error($"get recvLocalConn fail: {self.ClientScene().Id} {routerAddress} {realAddress} {localConn} {remoteConn}");
@@ -67,8 +67,7 @@ namespace ET.Client
                     
                     session.LastRecvTime = TimeHelper.ClientNow();
                     
-                    IPEndPoint remoteAddress = NetworkHelper.ToIPEndPoint(routerAddress);
-                    ((KService)session.AService).ChangeAddress(sessionId, remoteAddress);
+                    ((KService)session.AService).ChangeAddress(sessionId, routerAddress);
                 }
                 catch (Exception e)
                 {

+ 8 - 8
Codes/Hotfix/Client/Demo/Router/RouterHelper.cs

@@ -7,9 +7,9 @@ namespace ET.Client
     public static class RouterHelper
     {
         // 注册router
-        public static async ETTask<Session> CreateRouterSession(Scene clientScene, string address)
+        public static async ETTask<Session> CreateRouterSession(Scene clientScene, IPEndPoint address)
         {
-            (uint recvLocalConn, string routerAddress) = await GetRouterAddress(clientScene, address, 0, 0);
+            (uint recvLocalConn, IPEndPoint routerAddress) = await GetRouterAddress(clientScene, address, 0, 0);
 
             if (recvLocalConn == 0)
             {
@@ -18,28 +18,28 @@ namespace ET.Client
             
             Log.Info($"get router: {recvLocalConn} {routerAddress}");
 
-            Session routerSession = clientScene.GetComponent<NetKcpComponent>().Create(NetworkHelper.ToIPEndPoint(routerAddress), NetworkHelper.ToIPEndPoint(address), recvLocalConn);
+            Session routerSession = clientScene.GetComponent<NetKcpComponent>().Create(routerAddress, address, recvLocalConn);
             routerSession.AddComponent<PingComponent>();
             routerSession.AddComponent<RouterCheckComponent>();
             
             return routerSession;
         }
         
-        public static async ETTask<(uint, string)> GetRouterAddress(Scene clientScene, string address, uint localConn, uint remoteConn)
+        public static async ETTask<(uint, IPEndPoint)> GetRouterAddress(Scene clientScene, IPEndPoint address, uint localConn, uint remoteConn)
         {
             Log.Info($"start get router address: {clientScene.Id} {address} {localConn} {remoteConn}");
             //return (RandomHelper.RandUInt32(), address);
             RouterAddressComponent routerAddressComponent = clientScene.GetComponent<RouterAddressComponent>();
-            string routerInfo = routerAddressComponent.GetAddress();
+            IPEndPoint routerInfo = routerAddressComponent.GetAddress();
             
-            uint recvLocalConn = await Connect(NetworkHelper.ToIPEndPoint(routerInfo), address, localConn, remoteConn);
+            uint recvLocalConn = await Connect(routerInfo, address, localConn, remoteConn);
             
             Log.Info($"finish get router address: {clientScene.Id} {address} {localConn} {remoteConn} {recvLocalConn} {routerInfo}");
             return (recvLocalConn, routerInfo);
         }
 
         // 向router申请
-        private static async ETTask<uint> Connect(IPEndPoint routerAddress, string realAddress, uint localConn, uint remoteConn)
+        private static async ETTask<uint> Connect(IPEndPoint routerAddress, IPEndPoint realAddress, uint localConn, uint remoteConn)
         {
             uint connectId = RandomHelper.RandUInt32();
             
@@ -54,7 +54,7 @@ namespace ET.Client
             sendCache.WriteTo(1, localConn);
             sendCache.WriteTo(5, remoteConn);
             sendCache.WriteTo(9, connectId);
-            byte[] addressBytes = realAddress.ToByteArray();
+            byte[] addressBytes = realAddress.ToString().ToByteArray();
             Array.Copy(addressBytes, 0, sendCache, 13, addressBytes.Length);
 
             Log.Info($"router connect: {connectId} {localConn} {remoteConn} {routerAddress} {realAddress}");

+ 1 - 1
Codes/Model/Client/Demo/Router/RouterAddressComponent.cs

@@ -7,7 +7,7 @@ namespace ET.Client
     [ComponentOf(typeof(Scene))]
     public class RouterAddressComponent: Entity, IAwake<string, int>
     {
-        public AddressFamily AddressFamily { get; set; }
+        public IPAddress RouterManagerIPAddress { get; set; }
         public string RouterManagerHost;
         public int RouterManagerPort;
         public HttpGetRouterResponse Info;

+ 13 - 2
Unity/Assets/Scripts/Core/Helper/NetworkHelper.cs

@@ -24,9 +24,20 @@ namespace ET
 			return list.ToArray();
 		}
 		
-		public static AddressFamily GetAddressFamily(string url)
+		// 优先获取IPV4的地址
+		public static IPAddress GetHostAddress(string hostName)
 		{
-			return Dns.GetHostEntry(url).AddressList[0].AddressFamily;
+			IPAddress[] ipAddresses = Dns.GetHostAddresses(hostName);
+			IPAddress returnIpAddress = null;
+			foreach (IPAddress ipAddress in ipAddresses)
+			{
+				returnIpAddress = ipAddress;
+				if (ipAddress.AddressFamily == AddressFamily.InterNetwork)
+				{
+					return ipAddress;
+				}
+			}
+			return returnIpAddress;
 		}
 		
 		public static IPEndPoint ToIPEndPoint(string host, int port)