/// <summary> /// Interpret a client's handshake, either sending a package /// of strings or completing the handshake. /// /// Uncached flow: <code> /// Client | Server /// | <-------------- Hash | /// | Need Strings ------> | <- you are here on server /// | <----------- Strings | /// | Dont Need Strings -> | <- you are here on server /// </code> /// /// Cached flow: <code> /// Client | Server /// | <-------------- Hash | /// | Dont Need Strings -> | <- you are here on server /// </code> /// /// Verification failure flow: <code> /// Client | Server /// | <-------------- Hash | /// | Need Strings ------> | <- you are here on server /// | <----------- Strings | /// + Hash Failed | /// | Need Strings ------> | <- you are here on server /// | <----------- Strings | /// | Dont Need Strings -> | /// </code> /// /// NOTE: Verification failure flow is currently not implemented. /// </summary> /// <seealso cref="NetworkInitialize"/> private void HandleClientHandshake(MsgMapStrClientHandshake msgMapStr) { DebugTools.Assert(_net.IsServer); DebugTools.Assert(_dict.Locked); var channel = msgMapStr.MsgChannel; LogSzr.Debug($"Received handshake from {channel.SessionId}."); if (!_incompleteHandshakes.TryGetValue(channel, out var handshake)) { channel.Disconnect("MsgMapStrClientHandshake without in-progress handshake."); return; } if (!msgMapStr.NeedsStrings) { LogSzr.Debug($"Completing handshake with {channel.SessionId}."); handshake.Tcs.SetResult(null); _incompleteHandshakes.Remove(channel); return; } if (handshake.HasRequestedStrings) { channel.Disconnect("Cannot request strings twice"); return; } handshake.HasRequestedStrings = true; var strings = _net.CreateNetMessage <MsgMapStrStrings>(); strings.Package = _mappedStringsPackage; LogSzr.Debug( $"Sending {_mappedStringsPackage!.Length} bytes sized mapped strings package to {channel.SessionId}."); _net.ServerSendMessage(strings, channel); }
/// <summary> /// Interpret a client's handshake, either sending a package /// of strings or completing the handshake. /// /// Uncached flow: <code> /// Client | Server /// | <-------------- Hash | /// | Need Strings ------> | <- you are here on server /// | <----------- Strings | /// | Dont Need Strings -> | <- you are here on server /// </code> /// /// Cached flow: <code> /// Client | Server /// | <-------------- Hash | /// | Dont Need Strings -> | <- you are here on server /// </code> /// /// Verification failure flow: <code> /// Client | Server /// | <-------------- Hash | /// | Need Strings ------> | <- you are here on server /// | <----------- Strings | /// + Hash Failed | /// | Need Strings ------> | <- you are here on server /// | <----------- Strings | /// | Dont Need Strings -> | /// </code> /// /// NOTE: Verification failure flow is currently not implemented. /// </summary> /// <seealso cref="NetworkInitialize"/> private void HandleClientHandshake(MsgMapStrClientHandshake msgMapStr) { DebugTools.Assert(_net.IsServer); DebugTools.Assert(_dict.Locked); LogSzr.Debug($"Received handshake from {msgMapStr.MsgChannel.RemoteEndPoint.Address}."); if (!msgMapStr.NeedsStrings) { LogSzr.Debug($"Completing handshake with {msgMapStr.MsgChannel.RemoteEndPoint.Address}."); _incompleteHandshakes.Remove(msgMapStr.MsgChannel); return; } // TODO: count and limit number of requests to send strings during handshake var strings = _net.CreateNetMessage <MsgMapStrStrings>(); strings.Package = _mappedStringsPackage; LogSzr.Debug( $"Sending {_mappedStringsPackage!.Length} bytes sized mapped strings package to {msgMapStr.MsgChannel.SessionId}."); _net.ServerSendMessage(strings, msgMapStr.MsgChannel); }