public Task Start() { return(Task.Run(() => { try { // Set connection id and increment the connections count. connectionId = connectionsCount++; logger.WriteTransportLine(String.Format( "Connected from {0} (counter: {1})\r\n", clientSocket.RemoteEndPoint, connectionId)); // This makes whatever you write in the stream is sent immediately. clientSocket.NoDelay = true; using (networkStream = new NetworkStream(clientSocket)) { AcceptCore(); } } catch (Exception ex) { logger.WriteErrorLine(ex.Message); } finally { logger.WriteTransportLine(String.Format( "Disconnected ({0}). Served {1} requests.", connectionId, requestsCount)); clientSocket.Close(); if (removeConnection != null) { removeConnection(this); } } })); }
private static void OnAccept(IAsyncResult asyncResult) { HeyLogger logger = new HeyLogger(); Socket socketListener = asyncResult.AsyncState as Socket; SslStream sslStream = null; string clientName = null; try { using (Socket clientSocket = socketListener.EndAccept(asyncResult)) { socketListener.BeginAccept(OnAccept, socketListener); clientName = clientSocket.RemoteEndPoint.ToString(); logger.WriteTransportLine(String.Format("Client connected from {0}\r\n", clientName)); NetworkStream networkStream = new NetworkStream(clientSocket); // Plain connection before upgrading to SSL? //message = ReadMessage(networkStream); //Console.WriteLine(message); RemoteCertificateValidationCallback callback = null; if (settings.ClientCertificateRequired) { callback = new RemoteCertificateValidationCallback(ValidateClientCertificate); } sslStream = new SslStream( networkStream, false, callback, null); sslStream.AuthenticateAsServer( serverCertificate, settings.ClientCertificateRequired, SslProtocols.Default, false); switch (settings.Protocol) { case ApplicationLayerProtocol.Http: DoHttp(logger, sslStream, clientSocket); break; case ApplicationLayerProtocol.Ws: DoWs(logger, sslStream, clientSocket); break; default: DoUndefined(sslStream); break; } } } catch (Exception ex) { logger.WriteErrorLine(ex.Message); } finally { logger.WriteTransportLine(String.Format("Disconnected from {0}\r\n", clientName)); if (sslStream != null) { SslClientCertificateInfo.Remove(sslStream.GetHashCode()); } } }