Explorar el Código

优化路由代码

tanghai hace 2 años
padre
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();
             Scene root = fiber.Root;
             
-            IPEndPoint realAddress = NetworkHelper.ToIPEndPoint(self.GetParent<Session>().RemoteAddress);
+            IPEndPoint realAddress = NetworkHelper.ToIPEndPoint(session.RemoteAddress);
             NetComponent netComponent = root.GetComponent<NetComponent>();
             
             while (true)
@@ -60,8 +60,6 @@ namespace ET.Client
                     }
                     
                     Log.Info($"get recvLocalConn ok: {root.Id} {routerAddress} {realAddress} {recvLocalConn} {localConn} {remoteConn}");
-
-                    session.RemoteAddress = routerAddress.ToString();
                     
                     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.OuterTcp.Dispose();
             self.InnerSocket.Dispose();
-            self.OuterNodes.Clear();
             self.IPEndPoint = null;
         }
 
@@ -93,7 +92,8 @@ namespace ET.Server
             for (int i = 0; i < n; ++i)
             {
                 uint id = self.checkTimeout.Dequeue();
-                if (!self.OuterNodes.TryGetValue(id, out var node))
+                RouterNode node = self.GetChild<RouterNode>(id);
+                if (node == null)
                 {
                     continue;
                 }
@@ -164,10 +164,9 @@ namespace ET.Server
                     uint connectId = BitConverter.ToUInt32(self.Cache, 9);
                     string realAddress = self.Cache.ToStr(13, messageLength - 13);
 
-                    RouterNode routerNode;
-
                     // 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}");
                         routerNode = self.New(realAddress, outerConn, innerConn, connectId, self.CloneAddress());
@@ -240,8 +239,8 @@ namespace ET.Server
                         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());
                         Log.Info($"router create: {realAddress} {outerConn} {innerConn} {routerNode.SyncIpEndPoint}");
@@ -266,12 +265,13 @@ namespace ET.Server
                         break;
                     }
 
+                    // 这里可以注释,因增加了connectid的检查,第三方很难通过检查
                     // 校验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不一样
                     if (routerNode.ConnectId != connectId)
@@ -280,7 +280,6 @@ namespace ET.Server
                         break;
                     }
 
-
                     // 校验内网地址
                     if (routerNode.InnerAddress != realAddress)
                     {
@@ -311,7 +310,8 @@ namespace ET.Server
                     uint outerConn = BitConverter.ToUInt32(self.Cache, 1); // remote
                     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}");
                         break;
@@ -361,7 +361,8 @@ namespace ET.Server
                     uint outerConn = BitConverter.ToUInt32(self.Cache, 1);
                     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}");
                         break;
@@ -398,7 +399,8 @@ namespace ET.Server
                     uint outerConn = BitConverter.ToUInt32(self.Cache, 1); // remote
                     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}");
                         break;
@@ -454,7 +456,8 @@ namespace ET.Server
                 {
                     uint innerConn = BitConverter.ToUInt32(self.Cache, 1);
                     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}");
                         break;
@@ -494,7 +497,8 @@ namespace ET.Server
                     uint innerConn = BitConverter.ToUInt32(self.Cache, 1); // remote
                     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}");
                         break;
@@ -521,7 +525,8 @@ namespace ET.Server
                     uint innerConn = BitConverter.ToUInt32(self.Cache, 1);
                     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}");
                         break;
@@ -558,7 +563,8 @@ namespace ET.Server
                     uint innerConn = BitConverter.ToUInt32(self.Cache, 1); // remote
                     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}");
                         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)
         {
-            RouterNode routerNode = self.AddChild<RouterNode>();
-            routerNode.OuterConn = outerConn;
+            RouterNode routerNode = self.AddChildWithId<RouterNode>(outerConn);
             routerNode.InnerConn = innerConn;
             routerNode.ConnectId = connectId;
             routerNode.InnerIpEndPoint = NetworkHelper.ToIPEndPoint(innerAddress);
@@ -602,7 +600,6 @@ namespace ET.Server
             routerNode.InnerAddress = innerAddress;
             routerNode.LastRecvInnerTime = TimeInfo.Instance.ClientNow();
             
-            self.OuterNodes.Add(outerConn, routerNode);
             self.checkTimeout.Enqueue(outerConn);
 
             routerNode.Status = RouterStatus.Sync;
@@ -631,9 +628,7 @@ namespace ET.Server
             {
                 return;
             }
-
-            self.OuterNodes.Remove(routerNode.OuterConn);
-
+            
             Log.Info($"router remove: {routerNode.Id} outerConn: {routerNode.OuterConn} innerConn: {routerNode.InnerConn}");
 
             routerNode.Dispose();

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

@@ -13,14 +13,12 @@
             self.OuterIpEndPoint = null;
             self.InnerIpEndPoint = null;
             self.RouterSyncCount = 0;
-            self.OuterConn = 0;
             self.InnerConn = 0;
         }
 
         [EntitySystem]
         private static void Destroy(this RouterNode self)
         {
-            self.OuterConn = 0;
             self.InnerConn = 0;
             self.LastRecvInnerTime = 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];
 
-        // 已经连接成功的,虽然跟id一样,但是没有经过验证的不会加到这里
-        public Dictionary<uint, RouterNode> OuterNodes = new();
-
         public Queue<uint> checkTimeout = new();
 
         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 SyncIpEndPoint;
         public IKcpTransport KcpTransport;
-        public uint OuterConn;
+
+        public uint OuterConn
+        {
+            get
+            {
+                return (uint)this.Id;
+            }
+        }
         public uint InnerConn;
         public uint ConnectId;
         public long LastRecvOuterTime;