Listing 1: Creating and connecting instances of a named pipe
// Create all instances of the named pipe.
//
for (dwIndex=0; dwIndex < dwNumPipeInstances; dwIndex++)
{
// Create named pipe. Note: in case of failure, the handle
// is INVALID_HANDLE_VALUE, *not* NULL.
//
m_ahPipes[dwIndex] = CreateNamedPipe(
m_achPipeName, // pointer to pipe name
PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED , // mode
PIPE_TYPE_BYTE | PIPE_WAIT, // pipe-specific modes
dwNumPipeInstances, // maximum number of instances
4096, // output buffer size, in bytes
4096, // input buffer size, in bytes
0, // default time-out time, in milliseconds
&secattrSA // pointer to security attributes structure
);
//
if ( INVALID_HANDLE_VALUE == m_ahPipes[dwIndex] )
{
THROW_WIN32_EXCEPTION ;
}
}
//
// End for-loop creating named pipes
// Now connect all named pipes asynchronously. This is
// done in a separate for-loop, because we don't want
// any clients to connect until we know all pipe instances
// have been created successfully.
//
for (dwIndex=0; dwIndex < dwNumPipeInstances; dwIndex++)
{
// Create overlapped event for named pipe connection
//
m_ahOlEventsAndExitEvent[dwIndex] = CreateEvent(
NULL, // pointer to security attributes
TRUE, // flag for manual-reset event
FALSE, // flag for initial state
NULL // pointer to event-object name
);
//
if ( NULL == m_ahOlEventsAndExitEvent[dwIndex] )
{
THROW_WIN32_EXCEPTION ;
}
// Connect the instance of the pipe asynchronously,
// using the event as overlapped event. Note: the function
// returns FALSE in two cases that aren't really errors.
// ERROR_PIPE_CONNECTED means a client has already snatched
// the pipe. ERROR_IO_PENDING means that the asynchronous
// call was successful, but no client has connected yet.
//
m_aOverlapped[dwIndex].hEvent
= m_ahOlEventsAndExitEvent[dwIndex] ;
bRetVal = ConnectNamedPipe(
m_ahPipes[dwIndex], // handle to named pipe to connect
&m_aOverlapped[dwIndex] // &overlapped structure
) ;
//
if ( ! bRetVal
&&
ERROR_IO_PENDING != GetLastError()
&&
ERROR_PIPE_CONNECTED != GetLastError() )
{
THROW_WIN32_EXCEPTION ;
}
}
//
// End for-loop connection named pipes
//End of File