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:
CreateNamedPipeWriteFile, and retries doing so as long as error ERROR_PIPE_LISTENING is returned (which is before any client is connected)CreateFileCloseHandleERROR_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_BUSYHence, 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.