Aracılığıyla paylaş


Adlandırılmış Kanal İstemcisi

Adlandırılmış kanal istemcisi, adlandırılmış kanala tanıtıcı açmak için CreateFile işlevini kullanır. Kanal varsa ancak tüm örnekleri meşgulse, CreateFile INVALID_HANDLE_VALUE döndürür ve GetLastError işlevi ERROR_PIPE_BUSY döndürür. Bu durumda adlandırılmış kanal istemcisi, adlandırılmış kanalın bir örneğinin kullanılabilir olmasını beklemek için WaitNamedPipe işlevini kullanır.

CreateFile işlevi, sunucu kanalı oluştururken belirtilen erişimle (çift yönlü, giden veya gelen) uyumsuzsa başarısız olur. Çift yönlü kanal için istemci okuma, yazma veya okuma/yazma erişimi belirtebilir; giden kanal (salt yazma sunucusu) için istemcinin salt okunur erişim belirtmesi gerekir; ve gelen kanal (salt okunur sunucu) için istemcinin salt yazma erişimi belirtmesi gerekir.

CreateFile tarafından döndürülen tanıtıcı varsayılan olarak bayt okuma modu, engelleme bekleme modu, çakışan mod devre dışı ve yazma modu devre dışıdır. Kanal istemcisi, FILE_FLAG_OVERLAPPED belirterek çakışan modu etkinleştirmek veya FILE_FLAG_WRITE_THROUGH belirterek yazma modunu etkinleştirmek için CreateFile kullanabilir. İstemci, PIPE_NOWAIT belirterek engelleme modunu etkinleştirmek veya PIPE_READMODE_MESSAGE belirterek ileti okuma modunu etkinleştirmek için SetNamedPipeHandleStateişlevini kullanabilir.

Aşağıdaki örnekte adlandırılmış bir kanal açan, kanal tutamacını ileti okuma moduna ayarlayan, sunucuya istek göndermek için WriteFile işlevini kullanan ve sunucunun yanıtını okumak için ReadFile işlevini kullanan bir kanal istemcisi gösterilmektedir. Bu kanal istemcisi, bu konunun en altında listelenen ileti türü sunuculardan herhangi biriyle kullanılabilir. Ancak bayt türündeki bir sunucuyla, ileti okuma moduna geçmek için SetNamedPipeHandleStateçağırdığında bu kanal istemcisi başarısız olur. İstemci ileti okuma modunda kanaldan okuduğundan, ReadFile işleminin kısmi bir iletiyi okuduktan sonra sıfır döndürmesi mümkündür. İleti okuma arabelleğinden daha büyük olduğunda bu durum ortaya çıkar. Bu durumda GetLastErrorERROR_MORE_DATA döndürür ve istemci ReadFileiçin ek çağrılar kullanarak iletinin geri kalanını okuyabilir.

Bu kanal istemcisi Ayrıca Bkz. altında listelenen kanal sunucularından herhangi biriyle kullanılabilir.

#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; 
}

çok iş parçacıklı kanal sunucusu

Çakışan G/Ç kullanarak Adlandırılmış kanal sunucusunu

tamamlama yordamlarını kullanarak Adlandırılmış kanal sunucusunu