My previous question on the same topic: C #: understanding asynchronous NamedPipeServerStream Now I have the following:
private void StartListeningPipes() { try { isPipeWorking = true; namedPipeServerStream = new NamedPipeServerStream(PIPENAME, PipeDirection.InOut, 1, PipeTransmissionMode.Byte, PipeOptions.Asynchronous, BUFFERSIZE, BUFFERSIZE); Console.Write("Waiting for client connection..."); while(isPipeWorking) { IAsyncResult asyncResult = namedPipeServerStream.BeginWaitForConnection(this.WaitForConnectionAsyncCallback, null); Thread.Sleep(3*1000); } } //// Catch the IOException that is raised if the pipe is broken or disconnected. catch (IOException e) { Console.WriteLine("IOException: {0}. Restart pipe server...", e.Message); StopListeningPipes(); StartListeningPipes(); } //// Catch ObjectDisposedException if server was stopped. Then do nothing. catch (ObjectDisposedException) { } } private void WaitForConnectionAsyncCallback(IAsyncResult result) { try { namedPipeServerStream.EndWaitForConnection(result); Console.WriteLine("Client connected."); namedPipeServerStream.WaitForPipeDrain(); byte[] buff = new byte[BUFFERSIZE]; namedPipeServerStream.Read(buff, 0, BUFFERSIZE); string recStr = TrimNulls(buff); Array.Clear(buff, 0, buff.Length); Console.WriteLine(); Console.WriteLine("'"+recStr+"'"); } catch (Exception e) { Console.WriteLine("Error: " + e.Message); } }
But I get
The pipe is being closed Exception every time I receive a message from a client
Why?
My client:
using (NamedPipeClientStream pipeStream = new NamedPipeClientStream(General.PIPENAME)) { try { byte[] bytes = General.Iso88591Encoding.GetBytes(sendingMessage); pipeStream.Write(bytes, 0, bytes.Length); pipeStream.Flush(); pipeStream.WaitForPipeDrain(); } catch (TimeoutException) { Console.WriteLine("Timeout error!"); } catch (Exception e) { Console.WriteLine(string.Format("Error! ", e.Message)); } }
Final code at the moment:
/// <summary> /// Create new NamedPipeServerStream for listening to pipe client connection /// </summary> private void ListenForPipeClients() { if (!this.isListeningToClients) return; try { PipeSecurity ps = new PipeSecurity(); PipeAccessRule par = new PipeAccessRule("Everyone", PipeAccessRights.ReadWrite, System.Security.AccessControl.AccessControlType.Allow); ps.AddAccessRule(par); pipeClientConnection = new NamedPipeServerStream(General.PIPENAME, PipeDirection.InOut, 1, PipeTransmissionMode.Byte, PipeOptions.Asynchronous, General.BUFFERSIZE, General.BUFFERSIZE, ps); Console.Write("Waiting for client connection..."); /*namedPipeServerStream.WaitForConnection(); OnPipeConnected(namedPipeServerStream);*/ IAsyncResult result = pipeClientConnection.BeginWaitForConnection(OnPipeConnected, pipeClientConnection); } catch (ObjectDisposedException) { //// Catch ObjectDisposedException if server was stopped. Then do nothing. } catch (Exception e) { Console.WriteLine("Error occures: {0}. Restart pipe server...", e.Message); this.logger.Add(LogLevel.Warning, string.Format("Error occures: {0}. Restart pipe server...", e.Message)); ListenForPipeClients(); } } /// <summary> /// Async callback on client connected action /// </summary> /// <param name="asyncResult">Async result</param> private void OnPipeConnected(IAsyncResult asyncResult) { using (var conn = (NamedPipeServerStream)asyncResult.AsyncState) { try { conn.EndWaitForConnection(asyncResult); Console.WriteLine("Client connected."); PipeClientConnection clientConnection = new PipeClientConnection(conn, notifierSenderCache, defaultStorageTime); } catch (Exception e) { Console.WriteLine(e.Message); this.logger.Add(LogLevel.Warning, e.Message); } } ListenForPipeClients(); }