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:
CreateNamedPipe
WriteFile
, and retries doing so as long as error ERROR_PIPE_LISTENING
is returned (which is before any client is connected)CreateFile
CloseHandle
ERROR_NO_DATA
when it attemps to write more dataDisconnectNamedPipe
, which I hoped should make it free againERROR_PIPE_NOT_CONNECTED
, it retries doing so until there is no errorCreateFile
on the pipe, it gets ERROR_PIPE_BUSY
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?
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.