Klien Pipa Bernama

Klien pipa bernama menggunakan fungsi CreateFile untuk membuka handel ke pipa bernama. Jika pipa ada tetapi semua instansnya sibuk, CreateFile mengembalikan INVALID_HANDLE_VALUE dan fungsi GetLastError mengembalikan ERROR_PIPE_BUSY. Ketika ini terjadi, klien pipa bernama menggunakan fungsi WaitNamedPipe untuk menunggu instans pipa bernama tersedia.

Fungsi CreateFile gagal jika akses yang ditentukan tidak kompatibel dengan akses yang ditentukan (dupleks, keluar, atau masuk) saat server membuat pipa. Untuk pipa dupleks, klien dapat menentukan akses baca, tulis, atau baca/tulis; untuk pipa keluar (server tulis-saja), klien harus menentukan akses baca-saja; dan untuk pipa masuk (server baca-saja), klien harus menentukan akses tulis-saja.

Handel yang dikembalikan oleh CreateFile default ke mode byte-read, mode blocking-wait, mode tumpang tindih dinonaktifkan, dan mode write-through dinonaktifkan. Klien pipa dapat menggunakan CreateFile untuk mengaktifkan mode tumpang tindih dengan menentukan FILE_FLAG_OVERLAPPED atau untuk mengaktifkan mode write-through dengan menentukan FILE_FLAG_WRITE_THROUGH. Klien dapat menggunakan fungsi SetNamedPipeHandleState untuk mengaktifkan mode nonblocking dengan menentukan PIPE_NOWAIT atau untuk mengaktifkan mode baca pesan dengan menentukan PIPE_READMODE_MESSAGE.

Contoh berikut menunjukkan klien pipa yang membuka pipa bernama, mengatur handel pipa ke mode baca pesan, menggunakan fungsi WriteFile untuk mengirim permintaan ke server, dan menggunakan fungsi ReadFile untuk membaca balasan server. Klien pipa ini dapat digunakan dengan salah satu server jenis pesan yang tercantum di bagian bawah topik ini. Namun, dengan server jenis byte, klien pipa ini gagal ketika memanggil SetNamedPipeHandleState untuk mengubah ke mode baca pesan. Karena klien membaca dari pipa dalam mode baca pesan, dimungkinkan bagi operasi ReadFile untuk mengembalikan nol setelah membaca pesan parsial. Ini terjadi ketika pesan lebih besar dari buffer baca. Dalam situasi ini, GetLastError mengembalikan ERROR_MORE_DATA, dan klien dapat membaca sisa pesan menggunakan panggilan tambahan ke ReadFile.

Klien pipa ini dapat digunakan dengan salah satu server pipa yang tercantum di bawah Lihat Juga.

#include <windows.h> 
#include <stdio.h>
#include <conio.h>
#include <tchar.h>

#define BUFSIZE 512
 
int _tmain(int argc, TCHAR *argv[]) 
{ 
   HANDLE hPipe; 
   LPTSTR lpvMessage=TEXT("Default message from client."); 
   TCHAR  chBuf[BUFSIZE]; 
   BOOL   fSuccess = FALSE; 
   DWORD  cbRead, cbToWrite, cbWritten, dwMode; 
   LPTSTR lpszPipename = TEXT("\\\\.\\pipe\\mynamedpipe"); 

   if( argc > 1 )
      lpvMessage = argv[1];
 
// Try to open a named pipe; wait for it, if necessary. 
 
   while (1) 
   { 
      hPipe = CreateFile( 
         lpszPipename,   // pipe name 
         GENERIC_READ |  // read and write access 
         GENERIC_WRITE, 
         0,              // no sharing 
         NULL,           // default security attributes
         OPEN_EXISTING,  // opens existing pipe 
         0,              // default attributes 
         NULL);          // no template file 
 
   // Break if the pipe handle is valid. 
 
      if (hPipe != INVALID_HANDLE_VALUE) 
         break; 
 
      // Exit if an error other than ERROR_PIPE_BUSY occurs. 
 
      if (GetLastError() != ERROR_PIPE_BUSY) 
      {
         _tprintf( TEXT("Could not open pipe. GLE=%d\n"), GetLastError() ); 
         return -1;
      }
 
      // All pipe instances are busy, so wait for 20 seconds. 
 
      if ( ! WaitNamedPipe(lpszPipename, 20000)) 
      { 
         printf("Could not open pipe: 20 second wait timed out."); 
         return -1;
      } 
   } 
 
// The pipe connected; change to message-read mode. 
 
   dwMode = PIPE_READMODE_MESSAGE; 
   fSuccess = SetNamedPipeHandleState( 
      hPipe,    // pipe handle 
      &dwMode,  // new pipe mode 
      NULL,     // don't set maximum bytes 
      NULL);    // don't set maximum time 
   if ( ! fSuccess) 
   {
      _tprintf( TEXT("SetNamedPipeHandleState failed. GLE=%d\n"), GetLastError() ); 
      return -1;
   }
 
// Send a message to the pipe server. 
 
   cbToWrite = (lstrlen(lpvMessage)+1)*sizeof(TCHAR);
   _tprintf( TEXT("Sending %d byte message: \"%s\"\n"), cbToWrite, lpvMessage); 

   fSuccess = WriteFile( 
      hPipe,                  // pipe handle 
      lpvMessage,             // message 
      cbToWrite,              // message length 
      &cbWritten,             // bytes written 
      NULL);                  // not overlapped 

   if ( ! fSuccess) 
   {
      _tprintf( TEXT("WriteFile to pipe failed. GLE=%d\n"), GetLastError() ); 
      return -1;
   }

   printf("\nMessage sent to server, receiving reply as follows:\n");
 
   do 
   { 
   // Read from the pipe. 
 
      fSuccess = ReadFile( 
         hPipe,    // pipe handle 
         chBuf,    // buffer to receive reply 
         BUFSIZE*sizeof(TCHAR),  // size of buffer 
         &cbRead,  // number of bytes read 
         NULL);    // not overlapped 
 
      if ( ! fSuccess && GetLastError() != ERROR_MORE_DATA )
         break; 
 
      _tprintf( TEXT("\"%s\"\n"), chBuf ); 
   } while ( ! fSuccess);  // repeat loop if ERROR_MORE_DATA 

   if ( ! fSuccess)
   {
      _tprintf( TEXT("ReadFile from pipe failed. GLE=%d\n"), GetLastError() );
      return -1;
   }

   printf("\n<End of message, press ENTER to terminate connection and exit>");
   _getch();
 
   CloseHandle(hPipe); 
 
   return 0; 
}

Server alur multithreaded

Server pipa bernama menggunakan I/O yang tumpang tindih

Server pipa bernama menggunakan rutinitas penyelesaian