CreateNamedPipe – Creating Named Pipe Server

Named Pipes are useful in Inter Process communication. Pipes will always have two ends. One on the Server (usually to listen and reply) and the client which connects and sends messages. So Pipes can be used in communicating among two programs very conveniently.

Named Pipe server can be created using CreateNamedPipe function. This function creates the pipe and returns a handle for the Pipe created. Then ConnectNamedPipe should be used to listen for any incoming connections from the client. Typically this waits in a infinite loops to keep receiving messages.

The following sample uses both CreateNamedPipe and ConnectNamedPipe to receive and print the messages. See the corresponding Named Pipe client.

CreateNamedPipe – Sample:

#include <windows.h>
#include <stdio.h>
#define BUFSIZE 1024
#define PIPE_TIMEOUT 5000

int main()
{         
BOOL fConnected;
LPTSTR lpszPipename = "\\\\.\\pipe\\SamplePipe";
CHAR chRequest[BUFSIZE];           DWORD cbBytesRead;
BOOL fSuccess;
HANDLE hPipe;
hPipe = CreateNamedPipe ( lpszPipename, PIPE_ACCESS_DUPLEX, // read/write access                                                   PIPE_TYPE_MESSAGE | // message type pipe                                                   PIPE_READMODE_MESSAGE | // message-read mode                                                   PIPE_WAIT, // blocking mode                                                   PIPE_UNLIMITED_INSTANCES, // max. instances                                                   BUFSIZE, // output buffer size                                                   BUFSIZE, // input buffer size                                                   PIPE_TIMEOUT, // client time-out                                                   NULL); // no security attribute
if (hPipe == INVALID_HANDLE_VALUE)
return true;
for (;;)
{
// Trying connectnamedpipe in sample for CreateNamedPipe
// Wait for the client to connect; if it succeeds,
// the function returns a nonzero value. If the function returns
// zero, GetLastError returns ERROR_PIPE_CONNECTED.
fConnected = ConnectNamedPipe(hPipe, NULL) ? TRUE : (GetLastError() == ERROR_PIPE_CONNECTED);
if (fConnected)
{
fSuccess = ReadFile (hPipe, // handle to pipe
chRequest, // buffer to receive data
BUFSIZE, // size of buffer
&cbBytesRead, // number of bytes read
NULL);
// not overlapped I/O
chRequest[cbBytesRead] = '\0';
printf("Data Received: %s\n",chRequest);
if (! fSuccess || cbBytesRead == 0)
break;
FlushFileBuffers(hPipe);
DisconnectNamedPipe(hPipe);
}
else
// The client could not connect in the CreateNamedPipe sample, so close the pipe.
CloseHandle(hPipe);
}
CloseHandle(hPipe);
return 1;
}

//End of sample using CreateNamedPipe

The above program waits infinitely for Client Pipes to connect from \\.\pipe\SamplePipe. When a client is connected and data is received, it is printed on to the console.