void ConnectAndReceiveLoop(Uri serverAddress) { try { // connection created above TcpClient client = conn.client; conn.receiveThread = Thread.CurrentThread; try { client.Connect(serverAddress.Host, serverAddress.Port); } catch (SocketException) { client.Dispose(); throw; } bool success = sslHelper.TryCreateStream(conn, serverAddress); if (!success) { Log.Warn("Failed to create Stream"); conn.Dispose(); return; } success = handshake.TryHandshake(conn, serverAddress); if (!success) { Log.Warn("Failed Handshake"); conn.Dispose(); return; } Log.Info("HandShake Successful"); state = ClientState.Connected; receiveQueue.Enqueue(new Message(EventType.Connected)); var sendThread = new Thread(() => { var sendConfig = new SendLoop.Config( conn, bufferSize: Constants.HeaderSize + Constants.MaskSize + maxMessageSize, setMask: true); SendLoop.Loop(sendConfig); }); conn.sendThread = sendThread; sendThread.IsBackground = true; sendThread.Start(); var config = new ReceiveLoop.Config(conn, maxMessageSize, false, receiveQueue, bufferPool); ReceiveLoop.Loop(config); } catch (ThreadInterruptedException e) { Log.InfoException(e); } catch (ThreadAbortException e) { Log.InfoException(e); } catch (Exception e) { Log.Exception(e); } finally { // close here in case connect fails conn?.Dispose(); } }
void HandshakeAndReceiveLoop(Connection conn) { try { bool success = sslHelper.TryCreateStream(conn); if (!success) { Log.Error($"Failed to create SSL Stream {conn}"); conn.Dispose(); return; } success = handShake.TryHandshake(conn); if (success) { Log.Info($"Sent Handshake {conn}"); } else { Log.Error($"Handshake Failed {conn}"); conn.Dispose(); return; } // check if Stop has been called since accepting this client if (serverStopped) { Log.Info("Server stops after successful handshake"); return; } conn.connId = Interlocked.Increment(ref _idCounter); connections.TryAdd(conn.connId, conn); receiveQueue.Enqueue(new Message(conn.connId, EventType.Connected)); var sendThread = new Thread(() => { var sendConfig = new SendLoop.Config( conn, bufferSize: Constants.HeaderSize + maxMessageSize, setMask: false); SendLoop.Loop(sendConfig); }); conn.sendThread = sendThread; sendThread.IsBackground = true; sendThread.Name = $"SendLoop {conn.connId}"; sendThread.Start(); var receiveConfig = new ReceiveLoop.Config( conn, maxMessageSize, expectMask: true, receiveQueue, bufferPool); ReceiveLoop.Loop(receiveConfig); } catch (ThreadInterruptedException e) { Log.InfoException(e); } catch (ThreadAbortException e) { Log.InfoException(e); } catch (Exception e) { Log.Exception(e); } finally { // close here in case connect fails conn.Dispose(); } }