Эх сурвалжийг харах

1.修复windows下打包kcp导致崩溃的bug
2.kcp简化了实现,客户端连接尝试10s请求,每300ms一次,直到收到服务器响应请求。服务端收到请求后也尝试10s响应请求,每300ms一次,直到收到客户端的第一个消息为止

tanghai 7 жил өмнө
parent
commit
b44fdec356

+ 1 - 1
Unity/Assets/Editor/BuildEditor/BuildHelper.cs

@@ -56,7 +56,7 @@ namespace ETEditor
 			switch (type)
 			{
 				case PlatformType.PC:
-					buildTarget = BuildTarget.StandaloneWindows;
+					buildTarget = BuildTarget.StandaloneWindows64;
 					exeName += ".exe";
 					break;
 				case PlatformType.Android:

+ 95 - 110
Unity/Assets/Plugins/x86_64/kcp.dll.meta

@@ -1,122 +1,107 @@
 fileFormatVersion: 2
 guid: 803f7857fdb47b34fbe04eda49b8aa85
-timeCreated: 1530266319
-licenseType: Pro
 PluginImporter:
+  externalObjects: {}
   serializedVersion: 2
   iconMap: {}
   executionOrder: {}
   isPreloaded: 0
   isOverridable: 0
   platformData:
-    data:
-      first:
-        '': Any
-      second:
-        enabled: 0
-        settings:
-          Exclude Android: 1
-          Exclude Editor: 0
-          Exclude Linux: 1
-          Exclude Linux64: 1
-          Exclude LinuxUniversal: 1
-          Exclude OSXIntel: 1
-          Exclude OSXIntel64: 1
-          Exclude OSXUniversal: 1
-          Exclude Win: 1
-          Exclude Win64: 1
-    data:
-      first:
-        Android: Android
-      second:
-        enabled: 0
-        settings:
-          CPU: ARMv7
-    data:
-      first:
-        Any: 
-      second:
-        enabled: 0
-        settings: {}
-    data:
-      first:
-        Editor: Editor
-      second:
-        enabled: 1
-        settings:
-          CPU: x86_64
-          DefaultValueInitialized: true
-          OS: Windows
-    data:
-      first:
-        Facebook: Win
-      second:
-        enabled: 0
-        settings:
-          CPU: None
-    data:
-      first:
-        Facebook: Win64
-      second:
-        enabled: 1
-        settings:
-          CPU: AnyCPU
-    data:
-      first:
-        Standalone: Linux
-      second:
-        enabled: 0
-        settings:
-          CPU: None
-    data:
-      first:
-        Standalone: Linux64
-      second:
-        enabled: 0
-        settings:
-          CPU: x86_64
-    data:
-      first:
-        Standalone: LinuxUniversal
-      second:
-        enabled: 0
-        settings:
-          CPU: None
-    data:
-      first:
-        Standalone: OSXIntel
-      second:
-        enabled: 0
-        settings:
-          CPU: None
-    data:
-      first:
-        Standalone: OSXIntel64
-      second:
-        enabled: 0
-        settings:
-          CPU: AnyCPU
-    data:
-      first:
-        Standalone: OSXUniversal
-      second:
-        enabled: 0
-        settings:
-          CPU: None
-    data:
-      first:
-        Standalone: Win
-      second:
-        enabled: 0
-        settings:
-          CPU: None
-    data:
-      first:
-        Standalone: Win64
-      second:
-        enabled: 0
-        settings:
-          CPU: AnyCPU
+  - first:
+      '': Any
+    second:
+      enabled: 0
+      settings:
+        Exclude Android: 1
+        Exclude Editor: 0
+        Exclude Linux: 0
+        Exclude Linux64: 0
+        Exclude LinuxUniversal: 0
+        Exclude OSXIntel: 1
+        Exclude OSXIntel64: 1
+        Exclude OSXUniversal: 0
+        Exclude Win: 1
+        Exclude Win64: 0
+  - first:
+      Android: Android
+    second:
+      enabled: 0
+      settings:
+        CPU: ARMv7
+  - first:
+      Any: 
+    second:
+      enabled: 0
+      settings: {}
+  - first:
+      Editor: Editor
+    second:
+      enabled: 1
+      settings:
+        CPU: x86_64
+        DefaultValueInitialized: true
+        OS: Windows
+  - first:
+      Facebook: Win
+    second:
+      enabled: 0
+      settings:
+        CPU: None
+  - first:
+      Facebook: Win64
+    second:
+      enabled: 1
+      settings:
+        CPU: AnyCPU
+  - first:
+      Standalone: Linux
+    second:
+      enabled: 1
+      settings:
+        CPU: None
+  - first:
+      Standalone: Linux64
+    second:
+      enabled: 1
+      settings:
+        CPU: x86_64
+  - first:
+      Standalone: LinuxUniversal
+    second:
+      enabled: 1
+      settings:
+        CPU: AnyCPU
+  - first:
+      Standalone: OSXIntel
+    second:
+      enabled: 0
+      settings:
+        CPU: None
+  - first:
+      Standalone: OSXIntel64
+    second:
+      enabled: 0
+      settings:
+        CPU: AnyCPU
+  - first:
+      Standalone: OSXUniversal
+    second:
+      enabled: 1
+      settings:
+        CPU: None
+  - first:
+      Standalone: Win
+    second:
+      enabled: 0
+      settings:
+        CPU: None
+  - first:
+      Standalone: Win64
+    second:
+      enabled: 1
+      settings:
+        CPU: AnyCPU
   userData: 
   assetBundleName: 
   assetBundleVariant: 

+ 22 - 19
Unity/Assets/Scripts/Module/Message/Network/KCP/KChannel.cs

@@ -28,7 +28,7 @@ namespace ETModel
 		private readonly Queue<WaitSendBuffer> sendBuffer = new Queue<WaitSendBuffer>();
 
 		private bool isConnected;
-		public bool isRecvFirstKcpMessage;
+		
 		private readonly IPEndPoint remoteEndPoint;
 
 		public uint lastRecvTime;
@@ -60,10 +60,9 @@ namespace ETModel
 			Kcp.KcpNodelay(this.kcp, 1, 10, 1, 1);
 			Kcp.KcpWndsize(this.kcp, 256, 256);
 			Kcp.KcpSetmtu(this.kcp, 470);
-			this.isConnected = true;
-			this.isRecvFirstKcpMessage = false;
 			this.lastRecvTime = kService.TimeNow;
 			this.CreateTime = kService.TimeNow;
+			this.Accept();
 		}
 
 		// connect
@@ -74,7 +73,6 @@ namespace ETModel
 			this.LocalConn = localConn;
 			this.socket = socket;
 			this.remoteEndPoint = remoteEndPoint;
-			this.isRecvFirstKcpMessage = false;
 			this.lastRecvTime = kService.TimeNow;
 			this.CreateTime = kService.TimeNow;
 			this.Connect();
@@ -169,24 +167,24 @@ namespace ETModel
 			HandleSend();
 		}
 
-		public void HandleAccept(uint remoteConn)
+		public void Accept()
 		{
 			if (this.socket == null)
 			{
 				return;
 			}
+			
+			uint timeNow = this.GetService().TimeNow;
 
-			// 如果channel已经收到过消息,则不再响应连接请求
-			if (this.isRecvFirstKcpMessage)
-			{
-				return;
-			}
 			try
 			{
 				this.packet.Bytes.WriteTo(0, KcpProtocalType.ACK);
 				this.packet.Bytes.WriteTo(1, LocalConn);
 				this.packet.Bytes.WriteTo(5, RemoteConn);
 				this.socket.SendTo(this.packet.Bytes, 0, 9, SocketFlags.None, remoteEndPoint);
+				
+				// 200毫秒后再次update发送connect请求
+				this.GetService().AddToUpdateNextTime(timeNow + 200, this.Id);
 			}
 			catch (Exception e)
 			{
@@ -211,7 +209,7 @@ namespace ETModel
 				this.socket.SendTo(this.packet.Bytes, 0, 5, SocketFlags.None, remoteEndPoint);
 				
 				// 200毫秒后再次update发送connect请求
-				this.GetService().AddToUpdateNextTime(timeNow + 200, this.Id);
+				this.GetService().AddToUpdateNextTime(timeNow + 300, this.Id);
 			}
 			catch (Exception e)
 			{
@@ -260,11 +258,21 @@ namespace ETModel
 					return;
 				}
 				
-				if (timeNow - this.lastRecvTime < 150)
+				if (timeNow - this.lastRecvTime < 200)
 				{
 					return;
 				}
-				this.Connect();
+
+				switch (ChannelType)
+				{
+					case ChannelType.Accept:
+						this.Accept();
+						break;
+					case ChannelType.Connect:
+						this.Connect();
+						break;
+				}
+				
 				return;
 			}
 
@@ -315,12 +323,7 @@ namespace ETModel
 				return;
 			}
 
-			// 收到了kcp消息则将自己从连接状态移除
-			if (!this.isRecvFirstKcpMessage)
-			{
-				this.GetService().RemoveFromWaitConnectChannels(this.RemoteConn);
-				this.isRecvFirstKcpMessage = true;
-			}
+			this.isConnected = true;
 			
 			Kcp.KcpInput(this.kcp, date, offset, length);
 			this.GetService().AddToUpdateNextTime(0, this.Id);

+ 25 - 59
Unity/Assets/Scripts/Module/Message/Network/KCP/KService.cs

@@ -38,8 +38,6 @@ namespace ETModel
 		#region 连接相关
 		// 记录等待连接的channel,10秒后或者第一个消息过来才会从这个dict中删除
 		private readonly Dictionary<uint, KChannel> waitConnectChannels = new Dictionary<uint, KChannel>();
-		private readonly List<uint> connectTimeoutChannels = new List<uint>();
-		private uint lastCheckTime;
 		#endregion
 
 		#region 定时器相关
@@ -162,10 +160,9 @@ namespace ETModel
 
 						remoteConn = BitConverter.ToUInt32(this.cache, 1);
 
-						// 如果等待连接状态,则重新响应请求
+						// 如果已经收到连接,则忽略
 						if (this.waitConnectChannels.TryGetValue(remoteConn, out kChannel))
 						{
-							kChannel.HandleAccept(remoteConn);
 							break;
 						}
 
@@ -174,8 +171,6 @@ namespace ETModel
 						this.localConnChannels[kChannel.LocalConn] = kChannel;
 						this.waitConnectChannels[remoteConn] = kChannel;
 
-						kChannel.HandleAccept(remoteConn);
-
 						this.OnAccept(kChannel);
 
 						break;
@@ -224,6 +219,9 @@ namespace ETModel
 						// 处理chanel
 						remoteConn = BitConverter.ToUInt32(this.cache, 1);
 						localConn = BitConverter.ToUInt32(this.cache, 5);
+
+						this.waitConnectChannels.Remove(remoteConn);
+						
 						kChannel = this.GetKChannel(localConn);
 						if (kChannel != null)
 						{
@@ -249,11 +247,6 @@ namespace ETModel
 			return (KChannel)aChannel;
 		}
 
-		public void RemoveFromWaitConnectChannels(uint remoteConn)
-		{
-			this.waitConnectChannels.Remove(remoteConn);
-		}
-
 		public override AChannel GetChannel(long id)
 		{
 			if (this.removedChannels.Contains(id))
@@ -309,7 +302,16 @@ namespace ETModel
 				return;
 			}
 			this.removedChannels.Enqueue(id);
-			channel.Dispose();
+
+			// 删除channel时检查等待连接状态的字典是否要清除
+			KChannel waitConnectChannel;
+			if (this.waitConnectChannels.TryGetValue(channel.RemoteConn, out waitConnectChannel))
+			{
+				if (waitConnectChannel.LocalConn == channel.LocalConn)
+				{
+					this.waitConnectChannels.Remove(channel.RemoteConn);
+				}
+			}
 		}
 
 #if !SERVER
@@ -329,14 +331,16 @@ namespace ETModel
 				kv.Value.Update();
 			}
 			
-			while (true)
+			while (this.removedChannels.Count > 0)
 			{
-				if (this.removedChannels.Count <= 0)
+				long id = this.removedChannels.Dequeue();
+				KChannel channel;
+				if (!this.localConnChannels.TryGetValue(id, out channel))
 				{
-					break;
+					continue;
 				}
-				long id = this.removedChannels.Dequeue();
 				this.localConnChannels.Remove(id);
+				channel.Dispose();
 			}
 		}
 #else
@@ -360,8 +364,6 @@ namespace ETModel
 			this.TimeNow = (uint)(TimeHelper.ClientNow() - this.StartTime);
 			
 			this.Recv();
-
-			this.CheckWaitTimeout();
 			
 			this.TimerOut();
 
@@ -380,52 +382,16 @@ namespace ETModel
 			}
 			this.updateChannels.Clear();
 
-			while (true)
+			while (this.removedChannels.Count > 0)
 			{
-				if (this.removedChannels.Count <= 0)
-				{
-					break;
-				}
 				long id = this.removedChannels.Dequeue();
-				this.localConnChannels.Remove(id);
-			}
-		}
-
-		// 2秒钟检查一次, 删除连接成功但是超过10秒还未发第一个消息过来的channel
-		private void CheckWaitTimeout()
-		{
-			if (this.TimeNow - this.lastCheckTime < 2000)
-			{
-				return;
-			}
-
-			this.lastCheckTime = this.TimeNow;
-
-			if (this.waitConnectChannels.Count == 0)
-			{
-				return;
-			}
-
-			this.connectTimeoutChannels.Clear();
-			foreach (KeyValuePair<uint,KChannel> kv in this.waitConnectChannels)
-			{
-				if (this.TimeNow - kv.Value.CreateTime < 10000)
-				{
-					continue;
-				}
-				this.connectTimeoutChannels.Add(kv.Key);
-			}
-
-			foreach (uint remoteConn in this.connectTimeoutChannels)
-			{
-				KChannel kChannel;
-				if (!this.waitConnectChannels.TryGetValue(remoteConn, out kChannel))
+				KChannel channel;
+				if (!this.localConnChannels.TryGetValue(id, out channel))
 				{
 					continue;
 				}
-
-				this.waitConnectChannels.Remove(remoteConn);
-				this.Remove(kChannel.LocalConn);
+				this.localConnChannels.Remove(id);
+				channel.Dispose();
 			}
 		}