Przeglądaj źródła

优化路由代码

tanghai 2 lat temu
rodzic
commit
28e1b67c8b

+ 1 - 3
Unity/Assets/Scripts/Hotfix/Client/Demo/NetClient/Router/RouterCheckComponentSystem.cs

@@ -19,7 +19,7 @@ namespace ET.Client
             Fiber fiber = self.Fiber();
             Fiber fiber = self.Fiber();
             Scene root = fiber.Root;
             Scene root = fiber.Root;
             
             
-            IPEndPoint realAddress = NetworkHelper.ToIPEndPoint(self.GetParent<Session>().RemoteAddress);
+            IPEndPoint realAddress = NetworkHelper.ToIPEndPoint(session.RemoteAddress);
             NetComponent netComponent = root.GetComponent<NetComponent>();
             NetComponent netComponent = root.GetComponent<NetComponent>();
             
             
             while (true)
             while (true)
@@ -60,8 +60,6 @@ namespace ET.Client
                     }
                     }
                     
                     
                     Log.Info($"get recvLocalConn ok: {root.Id} {routerAddress} {realAddress} {recvLocalConn} {localConn} {remoteConn}");
                     Log.Info($"get recvLocalConn ok: {root.Id} {routerAddress} {realAddress} {recvLocalConn} {localConn} {remoteConn}");
-
-                    session.RemoteAddress = routerAddress.ToString();
                     
                     
                     session.LastRecvTime = TimeInfo.Instance.ClientNow();
                     session.LastRecvTime = TimeInfo.Instance.ClientNow();
                     
                     

+ 28 - 33
Unity/Assets/Scripts/Hotfix/Server/Module/Router/RouterComponentSystem.cs

@@ -24,7 +24,6 @@ namespace ET.Server
             self.OuterUdp.Dispose();
             self.OuterUdp.Dispose();
             self.OuterTcp.Dispose();
             self.OuterTcp.Dispose();
             self.InnerSocket.Dispose();
             self.InnerSocket.Dispose();
-            self.OuterNodes.Clear();
             self.IPEndPoint = null;
             self.IPEndPoint = null;
         }
         }
 
 
@@ -93,7 +92,8 @@ namespace ET.Server
             for (int i = 0; i < n; ++i)
             for (int i = 0; i < n; ++i)
             {
             {
                 uint id = self.checkTimeout.Dequeue();
                 uint id = self.checkTimeout.Dequeue();
-                if (!self.OuterNodes.TryGetValue(id, out var node))
+                RouterNode node = self.GetChild<RouterNode>(id);
+                if (node == null)
                 {
                 {
                     continue;
                     continue;
                 }
                 }
@@ -164,10 +164,9 @@ namespace ET.Server
                     uint connectId = BitConverter.ToUInt32(self.Cache, 9);
                     uint connectId = BitConverter.ToUInt32(self.Cache, 9);
                     string realAddress = self.Cache.ToStr(13, messageLength - 13);
                     string realAddress = self.Cache.ToStr(13, messageLength - 13);
 
 
-                    RouterNode routerNode;
-
                     // RouterAck之后ConnectIdNodes会删除,加入到OuterNodes中来
                     // RouterAck之后ConnectIdNodes会删除,加入到OuterNodes中来
-                    if (!self.OuterNodes.TryGetValue(outerConn, out routerNode))
+                    RouterNode routerNode = self.GetChild<RouterNode>(outerConn);
+                    if (routerNode == null)
                     {
                     {
                         Log.Info($"router create reconnect: {self.IPEndPoint} {realAddress} {outerConn} {innerConn}");
                         Log.Info($"router create reconnect: {self.IPEndPoint} {realAddress} {outerConn} {innerConn}");
                         routerNode = self.New(realAddress, outerConn, innerConn, connectId, self.CloneAddress());
                         routerNode = self.New(realAddress, outerConn, innerConn, connectId, self.CloneAddress());
@@ -240,8 +239,8 @@ namespace ET.Server
                         break;
                         break;
                     }
                     }
                     
                     
-                    RouterNode routerNode;
-                    if (!self.OuterNodes.TryGetValue(outerConn, out routerNode))
+                    RouterNode routerNode = self.GetChild<RouterNode>(outerConn);
+                    if (routerNode == null)
                     {
                     {
                         routerNode = self.New(realAddress, outerConn, innerConn, connectId, self.CloneAddress());
                         routerNode = self.New(realAddress, outerConn, innerConn, connectId, self.CloneAddress());
                         Log.Info($"router create: {realAddress} {outerConn} {innerConn} {routerNode.SyncIpEndPoint}");
                         Log.Info($"router create: {realAddress} {outerConn} {innerConn} {routerNode.SyncIpEndPoint}");
@@ -266,12 +265,13 @@ namespace ET.Server
                         break;
                         break;
                     }
                     }
 
 
+                    // 这里可以注释,因增加了connectid的检查,第三方很难通过检查
                     // 校验ip,连接过程中ip不能变化
                     // 校验ip,连接过程中ip不能变化
-                    if (!Equals(routerNode.SyncIpEndPoint, self.IPEndPoint))
-                    {
-                        Log.Warning($"kcp router syn ip is diff1: {routerNode.SyncIpEndPoint} {self.IPEndPoint}");
-                        break;
-                    }
+                    //if (!Equals(routerNode.SyncIpEndPoint, self.IPEndPoint))
+                    //{
+                    //    Log.Warning($"kcp router syn ip is diff1: {routerNode.SyncIpEndPoint} {self.IPEndPoint}");
+                    //    break;
+                    //}
                     
                     
                     // 这里因为InnerConn是0,无法保证连接是同一客户端发过来的,所以这里如果connectid不同,则break。注意逻辑跟reconnect不一样
                     // 这里因为InnerConn是0,无法保证连接是同一客户端发过来的,所以这里如果connectid不同,则break。注意逻辑跟reconnect不一样
                     if (routerNode.ConnectId != connectId)
                     if (routerNode.ConnectId != connectId)
@@ -280,7 +280,6 @@ namespace ET.Server
                         break;
                         break;
                     }
                     }
 
 
-
                     // 校验内网地址
                     // 校验内网地址
                     if (routerNode.InnerAddress != realAddress)
                     if (routerNode.InnerAddress != realAddress)
                     {
                     {
@@ -311,7 +310,8 @@ namespace ET.Server
                     uint outerConn = BitConverter.ToUInt32(self.Cache, 1); // remote
                     uint outerConn = BitConverter.ToUInt32(self.Cache, 1); // remote
                     uint innerConn = BitConverter.ToUInt32(self.Cache, 5);
                     uint innerConn = BitConverter.ToUInt32(self.Cache, 5);
                     
                     
-                    if (!self.OuterNodes.TryGetValue(outerConn, out RouterNode routerNode))
+                    RouterNode routerNode = self.GetChild<RouterNode>(outerConn);
+                    if (routerNode == null)
                     {
                     {
                         Log.Warning($"kcp router syn not found outer nodes: {outerConn} {innerConn}");
                         Log.Warning($"kcp router syn not found outer nodes: {outerConn} {innerConn}");
                         break;
                         break;
@@ -361,7 +361,8 @@ namespace ET.Server
                     uint outerConn = BitConverter.ToUInt32(self.Cache, 1);
                     uint outerConn = BitConverter.ToUInt32(self.Cache, 1);
                     uint innerConn = BitConverter.ToUInt32(self.Cache, 5);
                     uint innerConn = BitConverter.ToUInt32(self.Cache, 5);
 
 
-                    if (!self.OuterNodes.TryGetValue(outerConn, out RouterNode routerNode))
+                    RouterNode routerNode = self.GetChild<RouterNode>(outerConn);
+                    if (routerNode == null)
                     {
                     {
                         Log.Warning($"kcp router outer fin not found outer nodes: {outerConn} {innerConn}");
                         Log.Warning($"kcp router outer fin not found outer nodes: {outerConn} {innerConn}");
                         break;
                         break;
@@ -398,7 +399,8 @@ namespace ET.Server
                     uint outerConn = BitConverter.ToUInt32(self.Cache, 1); // remote
                     uint outerConn = BitConverter.ToUInt32(self.Cache, 1); // remote
                     uint innerConn = BitConverter.ToUInt32(self.Cache, 5); // local
                     uint innerConn = BitConverter.ToUInt32(self.Cache, 5); // local
 
 
-                    if (!self.OuterNodes.TryGetValue(outerConn, out RouterNode routerNode))
+                    RouterNode routerNode = self.GetChild<RouterNode>(outerConn);
+                    if (routerNode == null)
                     {
                     {
                         Log.Warning($"kcp router msg not found outer nodes: {outerConn} {innerConn}");
                         Log.Warning($"kcp router msg not found outer nodes: {outerConn} {innerConn}");
                         break;
                         break;
@@ -454,7 +456,8 @@ namespace ET.Server
                 {
                 {
                     uint innerConn = BitConverter.ToUInt32(self.Cache, 1);
                     uint innerConn = BitConverter.ToUInt32(self.Cache, 1);
                     uint outerConn = BitConverter.ToUInt32(self.Cache, 5);
                     uint outerConn = BitConverter.ToUInt32(self.Cache, 5);
-                    if (!self.OuterNodes.TryGetValue(outerConn, out RouterNode routerNode))
+                    RouterNode routerNode = self.GetChild<RouterNode>(outerConn);
+                    if (routerNode == null)
                     {
                     {
                         Log.Warning($"router node error: {innerConn} {outerConn}");
                         Log.Warning($"router node error: {innerConn} {outerConn}");
                         break;
                         break;
@@ -494,7 +497,8 @@ namespace ET.Server
                     uint innerConn = BitConverter.ToUInt32(self.Cache, 1); // remote
                     uint innerConn = BitConverter.ToUInt32(self.Cache, 1); // remote
                     uint outerConn = BitConverter.ToUInt32(self.Cache, 5); // local
                     uint outerConn = BitConverter.ToUInt32(self.Cache, 5); // local
 
 
-                    if (!self.OuterNodes.TryGetValue(outerConn, out RouterNode routerNode))
+                    RouterNode routerNode = self.GetChild<RouterNode>(outerConn);
+                    if (routerNode == null)
                     {
                     {
                         Log.Warning($"kcp router ack not found outer nodes: {outerConn} {innerConn}");
                         Log.Warning($"kcp router ack not found outer nodes: {outerConn} {innerConn}");
                         break;
                         break;
@@ -521,7 +525,8 @@ namespace ET.Server
                     uint innerConn = BitConverter.ToUInt32(self.Cache, 1);
                     uint innerConn = BitConverter.ToUInt32(self.Cache, 1);
                     uint outerConn = BitConverter.ToUInt32(self.Cache, 5);
                     uint outerConn = BitConverter.ToUInt32(self.Cache, 5);
 
 
-                    if (!self.OuterNodes.TryGetValue(outerConn, out RouterNode routerNode))
+                    RouterNode routerNode = self.GetChild<RouterNode>(outerConn);
+                    if (routerNode == null)
                     {
                     {
                         Log.Warning($"kcp router inner fin not found outer nodes: {outerConn} {innerConn}");
                         Log.Warning($"kcp router inner fin not found outer nodes: {outerConn} {innerConn}");
                         break;
                         break;
@@ -558,7 +563,8 @@ namespace ET.Server
                     uint innerConn = BitConverter.ToUInt32(self.Cache, 1); // remote
                     uint innerConn = BitConverter.ToUInt32(self.Cache, 1); // remote
                     uint outerConn = BitConverter.ToUInt32(self.Cache, 5); // local
                     uint outerConn = BitConverter.ToUInt32(self.Cache, 5); // local
 
 
-                    if (!self.OuterNodes.TryGetValue(outerConn, out RouterNode routerNode))
+                    RouterNode routerNode = self.GetChild<RouterNode>(outerConn);
+                    if (routerNode == null)
                     {
                     {
                         Log.Warning($"kcp router inner msg not found outer nodes: {outerConn} {innerConn}");
                         Log.Warning($"kcp router inner msg not found outer nodes: {outerConn} {innerConn}");
                         break;
                         break;
@@ -584,17 +590,9 @@ namespace ET.Server
             }
             }
         }
         }
 
 
-        public static RouterNode Get(this RouterComponent self, uint outerConn)
-        {
-            RouterNode routerNode = null;
-            self.OuterNodes.TryGetValue(outerConn, out routerNode);
-            return routerNode;
-        }
-
         private static RouterNode New(this RouterComponent self, string innerAddress, uint outerConn, uint innerConn, uint connectId, IPEndPoint syncEndPoint)
         private static RouterNode New(this RouterComponent self, string innerAddress, uint outerConn, uint innerConn, uint connectId, IPEndPoint syncEndPoint)
         {
         {
-            RouterNode routerNode = self.AddChild<RouterNode>();
-            routerNode.OuterConn = outerConn;
+            RouterNode routerNode = self.AddChildWithId<RouterNode>(outerConn);
             routerNode.InnerConn = innerConn;
             routerNode.InnerConn = innerConn;
             routerNode.ConnectId = connectId;
             routerNode.ConnectId = connectId;
             routerNode.InnerIpEndPoint = NetworkHelper.ToIPEndPoint(innerAddress);
             routerNode.InnerIpEndPoint = NetworkHelper.ToIPEndPoint(innerAddress);
@@ -602,7 +600,6 @@ namespace ET.Server
             routerNode.InnerAddress = innerAddress;
             routerNode.InnerAddress = innerAddress;
             routerNode.LastRecvInnerTime = TimeInfo.Instance.ClientNow();
             routerNode.LastRecvInnerTime = TimeInfo.Instance.ClientNow();
             
             
-            self.OuterNodes.Add(outerConn, routerNode);
             self.checkTimeout.Enqueue(outerConn);
             self.checkTimeout.Enqueue(outerConn);
 
 
             routerNode.Status = RouterStatus.Sync;
             routerNode.Status = RouterStatus.Sync;
@@ -631,9 +628,7 @@ namespace ET.Server
             {
             {
                 return;
                 return;
             }
             }
-
-            self.OuterNodes.Remove(routerNode.OuterConn);
-
+            
             Log.Info($"router remove: {routerNode.Id} outerConn: {routerNode.OuterConn} innerConn: {routerNode.InnerConn}");
             Log.Info($"router remove: {routerNode.Id} outerConn: {routerNode.OuterConn} innerConn: {routerNode.InnerConn}");
 
 
             routerNode.Dispose();
             routerNode.Dispose();

+ 0 - 2
Unity/Assets/Scripts/Hotfix/Server/Module/Router/RouterNodeSystem.cs

@@ -13,14 +13,12 @@
             self.OuterIpEndPoint = null;
             self.OuterIpEndPoint = null;
             self.InnerIpEndPoint = null;
             self.InnerIpEndPoint = null;
             self.RouterSyncCount = 0;
             self.RouterSyncCount = 0;
-            self.OuterConn = 0;
             self.InnerConn = 0;
             self.InnerConn = 0;
         }
         }
 
 
         [EntitySystem]
         [EntitySystem]
         private static void Destroy(this RouterNode self)
         private static void Destroy(this RouterNode self)
         {
         {
-            self.OuterConn = 0;
             self.InnerConn = 0;
             self.InnerConn = 0;
             self.LastRecvInnerTime = 0;
             self.LastRecvInnerTime = 0;
             self.LastRecvOuterTime = 0;
             self.LastRecvOuterTime = 0;

+ 0 - 3
Unity/Assets/Scripts/Model/Server/Module/Router/RouterComponent.cs

@@ -16,9 +16,6 @@ namespace ET.Server
 
 
         public byte[] Cache = new byte[1500];
         public byte[] Cache = new byte[1500];
 
 
-        // 已经连接成功的,虽然跟id一样,但是没有经过验证的不会加到这里
-        public Dictionary<uint, RouterNode> OuterNodes = new();
-
         public Queue<uint> checkTimeout = new();
         public Queue<uint> checkTimeout = new();
 
 
         public long LastCheckTime = 0;
         public long LastCheckTime = 0;

+ 8 - 1
Unity/Assets/Scripts/Model/Server/Module/Router/RouterNode.cs

@@ -16,7 +16,14 @@ namespace ET.Server
         public IPEndPoint OuterIpEndPoint;
         public IPEndPoint OuterIpEndPoint;
         public IPEndPoint SyncIpEndPoint;
         public IPEndPoint SyncIpEndPoint;
         public IKcpTransport KcpTransport;
         public IKcpTransport KcpTransport;
-        public uint OuterConn;
+
+        public uint OuterConn
+        {
+            get
+            {
+                return (uint)this.Id;
+            }
+        }
         public uint InnerConn;
         public uint InnerConn;
         public uint ConnectId;
         public uint ConnectId;
         public long LastRecvOuterTime;
         public long LastRecvOuterTime;