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.