views:

696

answers:

1

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:

  • server creates a pipe using CreateNamedPipe
  • server writes data using WriteFile, and retries doing so as long as error ERROR_PIPE_LISTENING is returned (which is before any client is connected)
  • clients connects using CreateFile
  • client reads data
  • client close pipe handle using CloseHandle
  • at this point server gets error ERROR_NO_DATA when it attemps to write more data
  • server disconnects the pipe using DisconnectNamedPipe, which I hoped should make it free again
  • server tries writing data, gets error ERROR_PIPE_NOT_CONNECTED, it retries doing so until there is no error
  • however, when new client connects, and attempts CreateFile 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?

+1  A: 

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

  • in reaction to ERROR_PIPE_NOT_CONNECTED, server performs:

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

Suma