Quellcode durchsuchen

ENetCS Test运行通过, connect accept receive过程中,假如peer断开,ConnectAsync AcceptAsync ReceiveAsync会抛出异常

tanghai vor 13 Jahren
Ursprung
Commit
00de0d7112

+ 1 - 0
CSharp/CSharp.sln.DotSettings

@@ -286,6 +286,7 @@ II.2.12 <HandlesEvent />
 	<s:Boolean x:Key="/Default/Environment/OpenDocument/OpenDocumentAfterModification/@EntryValue">True</s:Boolean>
 	<s:Boolean x:Key="/Default/Environment/SearchAndNavigation/MergeOccurences/@EntryValue">True</s:Boolean>
 	<s:Boolean x:Key="/Default/Environment/TextControl/HighlightCurrentLine/@EntryValue">True</s:Boolean>
+	<s:Boolean x:Key="/Default/Environment/UnitTesting/MsTestProvider/UseTestRunConfigFromMetadataFile/@EntryValue">False</s:Boolean>
 	<s:Boolean x:Key="/Default/Environment/UpdatesManger/IsDownloadUpdateDataAllowed/@EntryValue">False</s:Boolean>
 	<s:String x:Key="/Default/Environment/UserInterface/ShortcutSchemeName/@EntryValue">VS</s:String>
 	<s:Boolean x:Key="/Default/Housekeeping/GlobalSettingsUpgraded/IsUpgraded/@EntryValue">True</s:Boolean>

+ 13 - 13
CSharp/Platform/ENetCS/ClientHost.cs

@@ -47,7 +47,7 @@ namespace ENet
 			{
 				if (e.EventState == EventState.DISCONNECTED)
 				{
-					throw new ENetException(3, "Connect Disconnected!");
+					tcs.TrySetException(new ENetException(3, "Peer Disconnected In Connect!"));
 				}
 				tcs.TrySetResult(peer);
 			};
@@ -70,7 +70,6 @@ namespace ENet
 				{
 					case EventType.Connect:
 					{
-						Logger.Debug("client connect");
 						var peer = this.PeersManager[ev.PeerPtr];
 						peer.PeerEvent.OnConnected(ev);
 						peer.PeerEvent.Connected = null;
@@ -78,7 +77,6 @@ namespace ENet
 					}
 					case EventType.Receive:
 					{
-						Logger.Debug("client recv");
 						var peer = this.PeersManager[ev.PeerPtr];
 						peer.PeerEvent.OnReceived(ev);
 						peer.PeerEvent.Received = null;
@@ -86,31 +84,33 @@ namespace ENet
 					}
 					case EventType.Disconnect:
 					{
-						Logger.Debug("client disconnect");
-
 						ev.EventState = EventState.DISCONNECTED;
+
 						var peer = this.PeersManager[ev.PeerPtr];
-						if (peer.PeerEvent.Connected != null)
+						PeerEvent peerEvent = peer.PeerEvent;
+
+						this.PeersManager.Remove(ev.PeerPtr);
+						peer.Dispose();
+
+						if (peerEvent.Connected != null)
 						{
-							peer.PeerEvent.OnConnected(ev);
+							peerEvent.OnConnected(ev);
 						}
-						else if (peer.PeerEvent.Received != null)
+						else if (peerEvent.Received != null)
 						{
-							peer.PeerEvent.OnReceived(ev);
+							peerEvent.OnReceived(ev);
 						}
 						else
 						{
-							peer.PeerEvent.OnDisconnect(ev);
+							peerEvent.OnDisconnect(ev);
 						}
-
-						this.PeersManager.Remove(ev.PeerPtr);
 						break;
 					}
 				}
 			}
 		}
 		
-		public void Run(int timeout = 0)
+		public void Start(int timeout = 0)
 		{
 			while (isRunning)
 			{

+ 5 - 0
CSharp/Platform/ENetCS/Host.cs

@@ -5,6 +5,11 @@ namespace ENet
 {
 	public abstract class Host: IDisposable
 	{
+		static Host()
+		{
+			Library.Initialize();
+		}
+
 		private readonly PeersManager peersManager = new PeersManager();
 
 		protected PeersManager PeersManager

+ 1 - 1
CSharp/Platform/ENetCS/NativeMethods.cs

@@ -85,7 +85,7 @@ namespace ENet
 		internal static extern void enet_time_set(uint newTimeBase);
 
 		[DllImport(LIB, CallingConvention = CallingConvention.Cdecl)]
-		internal static extern IntPtr enet_packet_create(string data, uint dataLength, PacketFlags flags);
+		internal static extern IntPtr enet_packet_create(byte[] data, uint dataLength, PacketFlags flags);
 
 		[DllImport(LIB, CallingConvention = CallingConvention.Cdecl)]
 		internal static extern void enet_packet_destroy(IntPtr packet);

+ 1 - 1
CSharp/Platform/ENetCS/Packet.cs

@@ -13,7 +13,7 @@ namespace ENet
 			this.packet = packet;
 		}
 
-		public Packet(string data, PacketFlags flags = PacketFlags.None)
+		public Packet(byte[] data, PacketFlags flags = PacketFlags.None)
 		{
 			if (data == null)
 			{

+ 3 - 2
CSharp/Platform/ENetCS/Peer.cs

@@ -1,6 +1,7 @@
 using System;
 using System.Runtime.InteropServices;
 using System.Threading.Tasks;
+using Log;
 
 namespace ENet
 {
@@ -82,7 +83,7 @@ namespace ENet
 			NativeMethods.enet_peer_throttle_configure(this.peer, interval, acceleration, deceleration);
 		}
 
-		public void Send(byte channelID, string data)
+		public void Send(byte channelID, byte[] data)
 		{
 			using (var packet = new Packet(data))
 			{
@@ -102,7 +103,7 @@ namespace ENet
 			{
 				if (e.EventState == EventState.DISCONNECTED)
 				{
-					throw new ENetException(3, "connect disconnected!");
+					tcs.TrySetException(new ENetException(3, "Peer Disconnected In Received"));
 				}
 				var packet = new Packet(e.PacketPtr);
 				tcs.TrySetResult(packet);

+ 21 - 18
CSharp/Platform/ENetCS/ServerHost.cs

@@ -6,7 +6,7 @@ namespace ENet
 {
 	public sealed class ServerHost : Host
 	{
-		private Action<Event> acceptHandler;
+		private Action<Event> acceptEvent;
 
 		public ServerHost(Address address, uint peerLimit = NativeMethods.ENET_PROTOCOL_MAXIMUM_PEER_ID,
 				uint channelLimit = 0, uint incomingBandwidth = 0,
@@ -36,16 +36,16 @@ namespace ENet
 
 		public Task<Peer> AcceptAsync()
 		{
-			if (acceptHandler != null)
+			if (this.acceptEvent != null)
 			{
 				throw new ENetException(0, "don't accept twice, when last accept not return!");
 			}
 			var tcs = new TaskCompletionSource<Peer>();
-			acceptHandler += e =>
+			this.acceptEvent += e =>
 			{
 				if (e.EventState == EventState.DISCONNECTED)
 				{
-					throw new ENetException(3, "Connect Disconnected!");
+					tcs.TrySetException(new ENetException(3, "Peer Disconnected In Accept!"));
 				}
 				var peer = new Peer(e.PeerPtr);
 				this.PeersManager.Add(e.PeerPtr, peer);
@@ -70,17 +70,15 @@ namespace ENet
 				{
 					case EventType.Connect:
 					{
-						Logger.Debug("server connect");
-						if (acceptHandler != null)
+						if (this.acceptEvent != null)
 						{
-							acceptHandler(ev);
-							acceptHandler = null;
+							this.acceptEvent(ev);
+							this.acceptEvent = null;
 						}
 						break;
 					}
 					case EventType.Receive:
 					{
-						Logger.Debug("server recv");
 						var peer = this.PeersManager[ev.PeerPtr];
 						peer.PeerEvent.OnReceived(ev);
 						peer.PeerEvent.Received = null;
@@ -88,30 +86,35 @@ namespace ENet
 					}
 					case EventType.Disconnect:
 					{
-						Logger.Debug("server disconnect");
 						ev.EventState = EventState.DISCONNECTED;
+
 						var peer = this.PeersManager[ev.PeerPtr];
-						if (acceptHandler != null)
+						PeerEvent peerEvent = peer.PeerEvent;
+
+						this.PeersManager.Remove(ev.PeerPtr);
+						peer.Dispose();
+						
+
+						if (this.acceptEvent != null)
 						{
-							acceptHandler(ev);
+							this.acceptEvent(ev);
 						}
-						else if (peer.PeerEvent.Received != null)
+						else if (peerEvent.Received != null)
 						{
-							peer.PeerEvent.OnReceived(ev);
+							peerEvent.OnReceived(ev);
 						}
 						else
 						{
-							peer.PeerEvent.OnDisconnect(ev);
+							peerEvent.OnDisconnect(ev);
 						}
-
-						this.PeersManager.Remove(ev.PeerPtr);
+						
 						break;
 					}
 				}
 			}
 		}
 
-		public void Run(int timeout = 0)
+		public void Start(int timeout = 0)
 		{
 			while (isRunning)
 			{

+ 11 - 0
CSharp/Platform/Helper/ByteHelper.cs

@@ -1,5 +1,6 @@
 using System;
 using System.Collections.Generic;
+using System.Globalization;
 using System.Text;
 
 namespace Helper
@@ -20,5 +21,15 @@ namespace Helper
 			}
 			return stringBuilder.ToString();
 		}
+
+		public static string ToStr(this IEnumerable<byte> bytes)
+		{
+			var stringBuilder = new StringBuilder();
+			foreach (byte b in bytes)
+			{
+				stringBuilder.Append(b.ToString(CultureInfo.InvariantCulture));
+			}
+			return stringBuilder.ToString();
+		}
 	}
 }

+ 6 - 0
CSharp/Platform/Helper/StringHelper.cs

@@ -10,5 +10,11 @@ namespace Helper
 			byte[] byteArray = Encoding.Default.GetBytes(str);
 			return byteArray;
 		}
+
+		public static byte[] ToByteArray(this string str)
+		{
+			byte[] byteArray = Encoding.Default.GetBytes(str);
+			return byteArray;
+		}
 	}
 }

+ 4 - 0
CSharp/PlatformTest/ENetCSTest/ENetCSTest.csproj

@@ -61,6 +61,10 @@
       <Project>{D0B4CFAC-A368-4742-9863-68776CFA9938}</Project>
       <Name>ENetCS</Name>
     </ProjectReference>
+    <ProjectReference Include="..\..\Platform\Helper\Helper.csproj">
+      <Project>{24233cd5-a5df-484b-a482-b79cb7a0d9cb}</Project>
+      <Name>Helper</Name>
+    </ProjectReference>
     <ProjectReference Include="..\..\Platform\Log\Log.csproj">
       <Project>{72e16572-fc1f-4a9e-bc96-035417239298}</Project>
       <Name>Log</Name>

+ 53 - 36
CSharp/PlatformTest/ENetCSTest/ENetClientServerTest.cs

@@ -1,5 +1,7 @@
-using System.Threading;
+using System;
+using System.Threading;
 using ENet;
+using Helper;
 using Log;
 using Microsoft.VisualStudio.TestTools.UnitTesting;
 
@@ -8,64 +10,79 @@ namespace ENetCSTest
 	[TestClass]
 	public class ENetClientServerTest
 	{
-		private static async void Connect(ClientHost host, Address address)
+		private static async void Client(ClientHost host, Address address)
 		{
-			Logger.Debug("Connect");
-			var peer = await host.ConnectAsync(address);
-			Logger.Debug("Connect OK");
-			var sPacket = new Packet("0123456789", PacketFlags.Reliable);
-			peer.Send(0, sPacket);
-			Logger.Debug("Send OK");
-			var rPacket = await peer.ReceiveAsync();
-			Logger.Debug("Receive OK");
+			try
+			{
+				Logger.Debug("Client Connect");
+				var peer = await host.ConnectAsync(address);
+				Logger.Debug("Client Connect OK");
+				var sPacket = new Packet("0123456789".ToByteArray(), PacketFlags.Reliable);
+				peer.Send(0, sPacket);
+				Logger.Debug("Client Send OK");
+				var rPacket = await peer.ReceiveAsync();
+				Logger.Debug("Client Receive OK");
 
-			Assert.AreEqual("9876543210", rPacket.Bytes.ToString());
+				CollectionAssert.AreEqual("9876543210".ToByteArray(), rPacket.Bytes);
 
-			await peer.DisconnectLaterAsync();
-			Logger.Debug("Disconnect OK");
-
-			host.Stop();
+				await peer.DisconnectLaterAsync();
+				Logger.Debug("Client Disconnect OK");
+			}
+			catch (ENetException e)
+			{
+				Assert.Fail("Client ENetException: {0}", e.Message);
+			}
+			finally
+			{
+				host.Stop();
+			}
 		}
 
-		private static async void Accept(ServerHost host)
+		private static async void Server(ServerHost host)
 		{
-			Logger.Debug("Accept");
-			var peer = await host.AcceptAsync();
-			Logger.Debug("Accept OK");
-			var rPacket = await peer.ReceiveAsync();
-			Logger.Debug("Receive OK");
-
-			Assert.AreEqual("0123456789", rPacket.Bytes.ToString());
+			try
+			{
+				Logger.Debug("Server Accept");
+				var peer = await host.AcceptAsync();
+				Logger.Debug("Server Accept OK");
+				var rPacket = await peer.ReceiveAsync();
+				Logger.Debug("Server Receive OK");
 
-			var sPacket = new Packet("9876543210", PacketFlags.Reliable);
-			peer.Send(0, sPacket);
-			Logger.Debug("Send OK");
-			await peer.DisconnectLaterAsync();
+				CollectionAssert.AreEqual("0123456789".ToByteArray(), rPacket.Bytes);
 
-			host.Stop();
+				var sPacket = new Packet("9876543210".ToByteArray(), PacketFlags.Reliable);
+				peer.Send(0, sPacket);
+				Logger.Debug("Server Send OK");
+				await peer.DisconnectLaterAsync();
+				Logger.Debug("Server Disconnected OK");
+			}
+			catch (ENetException e)
+			{
+				Assert.Fail("Server ENetException: {0}", e.Message);
+			}
+			finally
+			{
+				host.Stop();
+			}
 		}
 
 		[TestMethod]
 		public void ClientSendToServer()
 		{
-			Library.Initialize();
-
 			var address = new Address { HostName = "127.0.0.1", Port = 8888 };
 			var clientHost = new ClientHost();
 			var serverHost = new ServerHost(address);
 
-			var server = new Thread(() => serverHost.Run(10));
-			var client = new Thread(() => clientHost.Run(10));
+			var server = new Thread(() => serverHost.Start(10));
+			var client = new Thread(() => clientHost.Start(10));
 
-			serverHost.Events += () => Accept(serverHost);
-			clientHost.Events += () => Connect(clientHost, address);
+			serverHost.Events += () => Server(serverHost);
+			clientHost.Events += () => Client(clientHost, address);
 			server.Start();
 			client.Start();
 
 			server.Join();
 			client.Join();
-
-			Library.Deinitialize();
 		}
 	}
 }