/// <summary> /// Wait on connection and received messages /// </summary> protected virtual void ReceiveAction() { try { using (NamedPipeServerStream serverStream = new NamedPipeServerStream( PipeName, PipeDirection.InOut, NumberOfThreads, PipeTransmissionMode.Byte, PipeOptions.Asynchronous)) { Task t = serverStream.WaitForConnectionAsync(CancellationToken.Token); t.GetAwaiter().GetResult(); Guid id = Guid.NewGuid(); IpcStream stream = new IpcStream(serverStream, KnownTypes); while (ProcessMessage(stream, id)) { } StatefulProxy.NotifyDisconnect(id); } // Todo: make sure there's a new listener, even when this isn't reached serverTask.Add(Task.Factory.StartNew(ReceiveAction)); } catch (OperationCanceledException) { } }
/// <summary> /// Main connection loop, waits for and handles connections /// </summary> protected override void ReceiveAction() { try { var t = listener.AcceptTcpClientAsync(CancellationToken.Token); // wait for connection using (System.Net.Sockets.TcpClient client = t.GetAwaiter().GetResult()) { // Start new connection waiter before anything can go wrong here, // leaving us without a server serverTask.Add(Task.Factory.StartNew(ReceiveAction)); using (NetworkStream networkStream = client.GetStream()) { networkStream.ReadTimeout = Server.ReadTimeOut; Stream serverStream = networkStream; Guid id = Guid.NewGuid(); IpcStream stream = new IpcStream(serverStream, KnownTypes, Encryptor); // process incoming messages until disconnect while (ProcessMessage(stream, id)) { } StatefulProxy.NotifyDisconnect(id); serverStream.Close(); } } } catch (OperationCanceledException) { } }