winapinamed-pipes

How to make a named pipe not busy after client has disconnected?


I use a named pipe and I want to reuse the same pipe on the server to allow connecting another client once the original client has disconnected. What I do is:

Hence, my question is: what other steps I need to do to disconnect client from the pipe properly so that a new client can connect?


Solution

  • Experimenting with various calls, I have found following to work fine:

    In reaction to ERROR_PIPE_NOT_CONNECTED, server should perform:

      // allow connecting, no wait
      DWORD mode = PIPE_NOWAIT;
      SetNamedPipeHandleState(_callstackPipe,&mode,NULL,NULL);
      ConnectNamedPipe(_callstackPipe,NULL);
      mode = PIPE_WAIT;
      SetNamedPipeHandleState(_callstackPipe,&mode,NULL,NULL);
    

    ConnectNamedPipe makes the pipe connectable (not busy) again.

    Note: pipe state is changed temporarily to PIPE_NOWAIT, as otherwise ConnectNamedPipe blocks the server thread waiting for the client infinitely.

    Other solution could probably be to close the handle completely on the server side and open it again.