Listing 3: Connecting the client side of a named pipe

// Wait for pipe connection
//
while  (1)
{
  
  printf("\nTrying to open named pipe...") ;
  fflush(stdout) ;
  hPipe = CreateFile( 
    PIPE_NAME,      // pipe name
    GENERIC_READ |  // read/write access
    GENERIC_WRITE, 
    0,              // no sharing
    NULL,           // no security attr.
    OPEN_EXISTING,  // opens existing pipe
    0,              // default attributes
    NULL);          // no template file 
  
  // Leave loop if pipe connected
  if (hPipe != INVALID_HANDLE_VALUE) break; 
  
  // Error ERROR_FILE_NOT_FOUND means pipe does not
  // exist.
  //  
  dwLastError = GetLastError() ;
  if ( ERROR_FILE_NOT_FOUND == dwLastError ) 
  {
    printf("server not ready.\n") ;
    return ;
  }
    
  // CreateFile may have failed because the pipe is 
  // busy. In that case, we wait for pipe to become
  // available by calling WaitNamedPipe. Note: Even
  // when WaitNamedPipe has returned, CreateFile may
  // fail again, because another client snatched the
  // pipe in between.
  //
  if ( ERROR_PIPE_BUSY != dwLastError ) 
  {
    printf("aborted with error %d\n", dwLastError) ;
    return ;
  }
  
  printf("\nAll instances busy. Waiting...") ;
  fflush(stdout) ;
  
  // Wait for pipe to become available
  //
  if ( ! WaitNamedPipe(PIPE_NAME, NMPWAIT_WAIT_FOREVER) ) 
  {
    printf("\nWait error.\n") ;
    return ;
  }
  
}
//End of File