listener.Start();
- DataReceivedEventArgs args = null;
+ DataReceivedEventArgs? args = null;
//Setup conneciton
connection.DataReceived += delegate(DataReceivedEventArgs a)
{
//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>
ManualResetEvent mutex2 = new ManualResetEvent(false);
//Setup listener
- DataReceivedEventArgs result = null;
+ DataReceivedEventArgs? result = null;
listener.NewConnection += delegate(NewConnectionEventArgs args)
{
args.Connection.DataReceived += delegate(DataReceivedEventArgs innerArgs)
//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>
}
}
}
-
- [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>
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;
/// <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;
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;
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
{