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:
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.