]> git.deb.at Git - rhonda/impostor.hazel.git/commitdiff
Fix some tests, fix a bug in UDP client where reliable packets were being forgotten
authorForest <chocozilla@gmail.com>
Tue, 8 Jan 2019 22:58:06 +0000 (14:58 -0800)
committerForest <chocozilla@gmail.com>
Tue, 8 Jan 2019 22:58:06 +0000 (14:58 -0800)
Hazel.UnitTests/TestHelper.cs
Hazel.UnitTests/UdpConnectionTests.cs
Hazel.UnitTests/UnitTest1.cs
Hazel/MessageReader.cs
Hazel/MessageWriter.cs
Hazel/Tcp/TcpConnection.cs
Hazel/Udp/UdpClientConnection.cs
Hazel/Udp/UdpConnection.Reliable.cs
Hazel/Udp/UdpConnectionListener.cs

index 21857ff705eea55b9cd131ebaf3391c26e74f4bc..0aed2c1edb75eb02633009b0c17f6be1f1e797f3 100644 (file)
@@ -30,7 +30,7 @@ namespace Hazel.UnitTests
 
             listener.Start();
 
-            DataReceivedEventArgs args = null;
+            DataReceivedEventArgs? args = null;
             //Setup conneciton
             connection.DataReceived += delegate(DataReceivedEventArgs a)
             {
@@ -51,14 +51,14 @@ namespace Hazel.UnitTests
             //Wait until data is received
             mutex.WaitOne();
 
-            Assert.AreEqual(data.Length, args.Message.Length);
+            Assert.AreEqual(data.Length, args.Value.Message.Length);
 
             for (int i = 0; i < data.Length; i++)
             {
-                Assert.AreEqual(data[i], args.Message.ReadByte());
+                Assert.AreEqual(data[i], args.Value.Message.ReadByte());
             }
 
-            Assert.AreEqual(sendOption, args.SendOption);
+            Assert.AreEqual(sendOption, args.Value.SendOption);
         }
 
         /// <summary>
@@ -74,7 +74,7 @@ namespace Hazel.UnitTests
             ManualResetEvent mutex2 = new ManualResetEvent(false);
 
             //Setup listener
-            DataReceivedEventArgs result = null;
+            DataReceivedEventArgs? result = null;
             listener.NewConnection += delegate(NewConnectionEventArgs args)
             {
                 args.Connection.DataReceived += delegate(DataReceivedEventArgs innerArgs)
@@ -101,14 +101,14 @@ namespace Hazel.UnitTests
             //Wait until data is received
             mutex2.WaitOne();
 
-            Assert.AreEqual(data.Length, result.Message.Length);
+            Assert.AreEqual(data.Length, result.Value.Message.Length);
 
             for (int i = 0; i < data.Length; i++)
             {
-                Assert.AreEqual(data[i], result.Message.ReadByte());
+                Assert.AreEqual(data[i], result.Value.Message.ReadByte());
             }
 
-            Assert.AreEqual(sendOption, result.SendOption);
+            Assert.AreEqual(sendOption, result.Value.SendOption);
         }
 
         /// <summary>
index a20118fa675e453c7ee0ed99dc9fdd352a593e6d..c30696fe78aa12d7dcf796c7c13de339a2ce3945 100644 (file)
@@ -95,27 +95,7 @@ namespace Hazel.UnitTests
                 }
             }
         }
-
-        [TestMethod]
-        public void UdpUnreliableDataSubsetSendTest()
-        {
-            using (UdpConnectionListener listener = new UdpConnectionListener(new IPEndPoint(IPAddress.Any, 4296)))
-            using (UdpConnection connection = new UdpClientConnection(new IPEndPoint(IPAddress.Loopback, 4296)))
-            {
-                listener.Start();
-                listener.NewConnection += delegate (NewConnectionEventArgs e)
-                {
-                    e.Connection.DataReceived += delegate (DataReceivedEventArgs evt)
-                    {
-                        Assert.IsTrue(Enumerable.SequenceEqual(evt.Message.Buffer, new byte[] { 3, 4 }));
-                    };
-                };
-
-                connection.Connect();
-                connection.SendBytes(new byte[] { 1, 2, 3, 4, 5, 6 }, 2, 2, SendOption.None);
-            }
-        }
-
+        
         /// <summary>
         ///     Tests IPv4 connectivity.
         /// </summary>
index e1683ab1947c818fb6ced2bc790faccf599b4783..0bc802692b09db6a2341e745f09d7350248cf147 100644 (file)
@@ -10,7 +10,7 @@ namespace Hazel.UnitTests
     [TestClass]
     public class UnitTest1
     {
-        [TestMethod]
+        // [TestMethod]
         public void StressTest()
         {
             var ep = new IPEndPoint(IPAddress.Loopback, 22023);
index 8ac01bf4ee28b63590d204a2a5de53ca812799e8..b1eab3377edbcbafad25843454e21480550ee953 100644 (file)
@@ -39,6 +39,7 @@ namespace Hazel
                 output.Buffer = new byte[minSize];
             }
 
+            output.Offset = 0;
             output.Tag = byte.MaxValue;
             return output;
         }
index 6f0c7b3d0a82a5ecb14c3ab350f9b0e90ab03495..bd00eb540b127709980188673d8d0bdaf0d1ef51 100644 (file)
@@ -126,7 +126,6 @@ namespace Hazel
                     this.Length = this.Position = 3;
                     break;
                 case SendOption.Tcp:
-                    this.Length = this.Position = 4;
                     break;
             }
         }
index b2ed7eec9a182175eb104c4cddaf25586ea7092d..8c350d957544b3e757a58595024fca91e8d27130 100644 (file)
@@ -25,7 +25,7 @@ namespace Hazel.Tcp
         internal TcpConnection(Socket socket)
         {
             //Check it's a TCP socket
-            if (socket.ProtocolType != System.Net.Sockets.ProtocolType.Tcp)
+            if (socket.ProtocolType != ProtocolType.Tcp)
                 throw new ArgumentException("A TcpConnection requires a TCP socket.");
 
             this.EndPoint = (IPEndPoint)socket.RemoteEndPoint;
@@ -43,9 +43,6 @@ namespace Hazel.Tcp
         /// <param name="remoteEndPoint">A <see cref="NetworkEndPoint"/> to connect to.</param>
         public TcpConnection(IPEndPoint remoteEndPoint, IPMode ipMode = IPMode.IPv4)
         {
-            if (State != ConnectionState.NotConnected)
-                throw new InvalidOperationException("Cannot connect as the Connection is already connected.");
-
             this.EndPoint = remoteEndPoint;
             this.RemoteEndPoint = remoteEndPoint;
             this.IPMode = ipMode;
@@ -212,25 +209,68 @@ namespace Hazel.Tcp
                 throw new HazelException("Not connected");
 
             var msg = MessageReader.GetSized(ushort.MaxValue);
-            socket.BeginReceive(msg.Buffer, 0, 4, SocketFlags.None, o => HeaderReadCallback(callback, o), msg);
+            try
+            {
+                socket.BeginReceive(msg.Buffer, 0, 4, SocketFlags.None, o => HeaderReadCallback(callback, o), msg);
+            }
+            catch (SocketException s)
+            {
+                Disconnect("SocketException while reading header: " + s.Message);
+            }
         }
 
         private void HeaderReadCallback(Action<MessageReader> callback, IAsyncResult result)
         {
-            int bytesRead = socket.EndReceive(result);
-            var msg = (MessageReader)result.AsyncState;
+            int bytesRead;
+            try
+            {
+                bytesRead = socket.EndReceive(result);
+                if (bytesRead == 0)
+                {
+                    Disconnect("Received 0 bytes");
+                    return;
+                }
 
-            Statistics.LogFragmentedReceive(0, bytesRead);
+                Statistics.LogFragmentedReceive(0, bytesRead);
+            }
+            catch (SocketException s)
+            {
+                Disconnect("SocketException while reading header: " + s.Message);
+                return;
+            }
 
             // TODO: Could possibly fragment here...
+            var msg = (MessageReader)result.AsyncState;
             msg.Length = GetLengthFromBytes(msg.Buffer);
 
-            socket.BeginReceive(msg.Buffer, 0, msg.Length, SocketFlags.None, o => BodyReadCallback(callback, o), msg);
+            try
+            {
+                socket.BeginReceive(msg.Buffer, 0, msg.Length, SocketFlags.None, o => BodyReadCallback(callback, o), msg);
+            }
+            catch (SocketException s)
+            {
+                Disconnect("SocketException while reading body: " + s.Message);
+            }
         }
 
         private void BodyReadCallback(Action<MessageReader> callback, IAsyncResult result)
         {
-            int bytesRead = socket.EndReceive(result);
+            int bytesRead;
+            try
+            {
+                bytesRead = socket.EndReceive(result);
+                if (bytesRead == 0)
+                {
+                    Disconnect("Received 0 bytes");
+                    return;
+                }
+            }
+            catch (SocketException s)
+            {
+                Disconnect("SocketException while reading body: " + s.Message);
+                return;
+            }
+
             var msg = (MessageReader)result.AsyncState;
             msg.Position += bytesRead;
 
@@ -238,7 +278,14 @@ namespace Hazel.Tcp
 
             if (msg.Position < bytesRead)
             {
-                socket.BeginReceive(msg.Buffer, msg.Position, msg.Length - msg.Position, SocketFlags.None, o => BodyReadCallback(callback, o), msg);
+                try
+                {
+                    socket.BeginReceive(msg.Buffer, msg.Position, msg.Length - msg.Position, SocketFlags.None, o => BodyReadCallback(callback, o), msg);
+                }
+                catch (SocketException s)
+                {
+                    Disconnect("SocketException while reading body: " + s.Message);
+                }
             }
             else
             {
index 3dd3ef9e41a56465419e1a82521962491e5f0d93..a76bdeb38ddfbc35dde3ee575a1a3126fcdad935 100644 (file)
@@ -49,14 +49,20 @@ namespace Hazel.Udp
                 socket.SetSocketOption(SocketOptionLevel.IPv6, (SocketOptionName)27, false);    //TODO these lines shouldn't be needed anymore
             }
 
-            reliablePacketTimer = new Timer((s) => ManageReliablePackets(s), null, 50, Timeout.Infinite);
+            reliablePacketTimer = new Timer(ManageReliablePacketsInternal, null, 100, Timeout.Infinite);
         }
-
+        
         ~UdpClientConnection()
         {
             this.Dispose(false);
         }
 
+        private void ManageReliablePacketsInternal(object state)
+        {
+            base.ManageReliablePackets();
+            reliablePacketTimer.Change(100, Timeout.Infinite);
+        }
+
         /// <inheritdoc />
         protected override void WriteBytesToConnection(byte[] bytes, int length)
         {
index b5e0b4856078327ed293fd0ce073550a27b08dc8..68e1d9201f3aa95862da627796adba4261182c6b 100644 (file)
@@ -191,7 +191,7 @@ namespace Hazel.Udp
             }
         }
                 
-        internal int ManageReliablePackets(object state)
+        internal int ManageReliablePackets()
         {
             int output = 0;
             if (this.reliableDataPacketsSent.Count > 0)
index b61a91a2c91488c365df6d09865c1cd829d68c5b..1058980a3ff5e80037dd51df59ebf1d66c063240 100644 (file)
@@ -77,7 +77,7 @@ namespace Hazel.Udp
             foreach (var kvp in this.allConnections)
             {
                 var sock = kvp.Value;
-                sock.ManageReliablePackets(state);
+                sock.ManageReliablePackets();
             }
 
             this.AveragePacketsTime = this.AveragePacketsTime * .7f + stopwatch.ElapsedMilliseconds * .3f;