From 865a7600f24f79c1159825c3beff90d4acf263a0 Mon Sep 17 00:00:00 2001 From: lidgren Date: Sat, 22 Feb 2014 09:52:40 +0000 Subject: [PATCH] Handle ConnectResponse despite connection being in place; to handle dropped handshake messages --- Lidgren.Network/NetConnection.Handshake.cs | 79 ++++++++++++---------- Lidgren.Network/NetConnection.cs | 20 ++++++ 2 files changed, 63 insertions(+), 36 deletions(-) diff --git a/Lidgren.Network/NetConnection.Handshake.cs b/Lidgren.Network/NetConnection.Handshake.cs index 29a38f9..b391b23 100644 --- a/Lidgren.Network/NetConnection.Handshake.cs +++ b/Lidgren.Network/NetConnection.Handshake.cs @@ -322,43 +322,9 @@ namespace Lidgren.Network m_peer.LogDebug("Unhandled Connect: " + tp + ", status is " + m_status + " length: " + payloadLength); break; case NetMessageType.ConnectResponse: - switch (m_status) - { - case NetConnectionStatus.InitiatedConnect: - // awesome - bool ok = ValidateHandshakeData(ptr, payloadLength, out hail); - if (ok) - { - if (hail != null) - { - m_remoteHailMessage = m_peer.CreateIncomingMessage(NetIncomingMessageType.Data, hail); - m_remoteHailMessage.LengthBits = (hail.Length * 8); - } - else - { - m_remoteHailMessage = null; - } - - m_peer.AcceptConnection(this); - SendConnectionEstablished(); - return; - } - break; - case NetConnectionStatus.RespondedConnect: - // hello, wtf? - break; - case NetConnectionStatus.Disconnecting: - case NetConnectionStatus.Disconnected: - case NetConnectionStatus.ReceivedInitiation: - case NetConnectionStatus.None: - // wtf? anyway, bye! - break; - case NetConnectionStatus.Connected: - // my ConnectionEstablished must have been lost, send another one - SendConnectionEstablished(); - return; - } + HandleConnectResponse(now, tp, ptr, payloadLength); break; + case NetMessageType.ConnectionEstablished: switch (m_status) { @@ -421,6 +387,47 @@ namespace Lidgren.Network } } + private void HandleConnectResponse(double now, NetMessageType tp, int ptr, int payloadLength) + { + byte[] hail; + switch (m_status) + { + case NetConnectionStatus.InitiatedConnect: + // awesome + bool ok = ValidateHandshakeData(ptr, payloadLength, out hail); + if (ok) + { + if (hail != null) + { + m_remoteHailMessage = m_peer.CreateIncomingMessage(NetIncomingMessageType.Data, hail); + m_remoteHailMessage.LengthBits = (hail.Length * 8); + } + else + { + m_remoteHailMessage = null; + } + + m_peer.AcceptConnection(this); + SendConnectionEstablished(); + return; + } + break; + case NetConnectionStatus.RespondedConnect: + // hello, wtf? + break; + case NetConnectionStatus.Disconnecting: + case NetConnectionStatus.Disconnected: + case NetConnectionStatus.ReceivedInitiation: + case NetConnectionStatus.None: + // wtf? anyway, bye! + break; + case NetConnectionStatus.Connected: + // my ConnectionEstablished must have been lost, send another one + SendConnectionEstablished(); + return; + } + } + private bool ValidateHandshakeData(int ptr, int payloadLength, out byte[] hail) { hail = null; diff --git a/Lidgren.Network/NetConnection.cs b/Lidgren.Network/NetConnection.cs index b0365f7..abdb42f 100644 --- a/Lidgren.Network/NetConnection.cs +++ b/Lidgren.Network/NetConnection.cs @@ -379,6 +379,26 @@ namespace Lidgren.Network switch (tp) { + case NetMessageType.Connect: + m_peer.LogDebug("Received handshake message (" + tp + ") despite connection being in place"); + break; + + case NetMessageType.ConnectResponse: + // handshake message must have been lost + HandleConnectResponse(now, tp, ptr, payloadLength); + break; + + case NetMessageType.ConnectionEstablished: + // do nothing, all's well + break; + + case NetMessageType.LibraryError: +#if DEBUG + throw new NetException("LibraryError received by ReceivedLibraryMessage; this usually indicates a malformed message"); +#else + break; +#endif + case NetMessageType.Disconnect: NetIncomingMessage msg = m_peer.SetupReadHelperMessage(ptr, payloadLength); ExecuteDisconnect(msg.ReadString(), false);