void ReadAsynchronously(StreamContext context) { context.Stream.BeginRead(context.Buffer, 0, context.Buffer.Length, OnAsynchronousRead, context); }
void ProcessClient(TcpClient localClient) { LocalStream = new SslStream(localClient.GetStream(), false); LocalStream.AuthenticateAsServer(ServerCertificate); TcpClient remoteClient = new TcpClient(); remoteClient.Connect(RemoteEndpoint); RemoteStream = new SslStream(remoteClient.GetStream(), false, new RemoteCertificateValidationCallback(TrustAllCertificates)); RemoteStream.AuthenticateAsClient(TargetHost); ServerEventHandler.OnConnect(); StreamContext localContext = new StreamContext(LocalStream); StreamContext remoteContext = new StreamContext(RemoteStream); ReadAsynchronously(remoteContext); while (Running) { int bytesRead; try { bytesRead = LocalStream.Read(localContext.Buffer, 0, localContext.Buffer.Length); if (bytesRead == 0) { CloseStreams(); ServerEventHandler.OnLocalDisconnect(); return; } } catch (IOException) { CloseStreams(); ServerEventHandler.OnLocalDisconnect(); return; } try { byte[] data = localContext.Buffer.Take(bytesRead).ToArray(); RemoteStream.Write(data); ServerEventHandler.OnClientToServerData(data); } catch (IOException) { CloseStreams(); ServerEventHandler.OnRemoteDisconnect(); return; } } }