2012-08-28 3 views
0

Je suis un peu de difficulté à faire une communication Duplex entre un serveur C# et un travail de C++:Duplex NAMEPIPE entre C# et C++

L'objectif est de créer le tuyau, lisez quelque chose du client et d'écrire quelque chose . Tout fonctionne bien si je lis juste du client ou écris juste au client mais je ne peux pas faire les uns après les autres!

Voici mon serveur C#:

// Create a name pipe 
using (NamedPipeServerStream pipeStream = new NamedPipeServerStream("TestPipe")) 
{ 
    Console.WriteLine("[Server] Pipe created {0}", pipeStream.GetHashCode()); 

    // Wait for a connection 
    pipeStream.WaitForConnection(); 
    Console.WriteLine("[Server] Pipe connection established"); 

    //Reading Part 
    using (StreamReader sr = new StreamReader(pipeStream)) 
    { 
     string temp; 
     while ((temp = sr.ReadLine()) != null) 
     { 
     Console.WriteLine("{0}: {1}", DateTime.Now, temp); 
     } 
    } 

    //Writing Part 
    using (StreamWriter sw = new StreamWriter(pipeStream)) 
    { 
     sw.AutoFlush = true; 
     String st = "send Back\0"; 
     sw.WriteLine(st); 
    } 
} 

Et voici le C++ client:

HANDLE hFile; 
BOOL flg; 
DWORD dwWrite; 
char szPipeUpdate[200]; 
hFile = CreateFile(L"\\\\.\\pipe\\TestPipe", GENERIC_WRITE|GENERIC_READ, 
          0, NULL, OPEN_EXISTING, 
          0, NULL); 


strcpy(szPipeUpdate,"Sending some data from client to server!"); 
if(hFile == INVALID_HANDLE_VALUE) 
    { 
     DWORD dw = GetLastError(); 
     printf("CreateFile failed for Named Pipe client\n:"); 
    } 
    else 
    { 
     flg = WriteFile(hFile, szPipeUpdate, strlen(szPipeUpdate), &dwWrite, NULL); 
     if (FALSE == flg) 
     { 
     printf("WriteFile failed for Named Pipe client\n"); 
     } 
     else 
     { 
     printf("WriteFile succeeded for Named Pipe client\n"); 
     } 
    } 

    printf("Let's read!\n"); 
    //Read the datas sent by the server 
    BOOL fFinishRead = FALSE; 
    do 
    { 
     char chResponse[200]; 
     DWORD cbResponse, cbRead; 
     cbResponse = sizeof(chResponse); 

     fFinishRead = ReadFile(
      hFile,     // Handle of the pipe 
      chResponse,    // Buffer to receive the reply 
      cbResponse,    // Size of buffer in bytes 
      &cbRead,    // Number of bytes read 
      NULL     // Not overlapped 
      ); 

     if (!fFinishRead && ERROR_MORE_DATA != GetLastError()) 
     { 
      DWORD dwError = GetLastError(); 
      wprintf(L"ReadFile from pipe failed w/err 0x%08lx\n", dwError); 
      break; 
     } 
     std::cout << chResponse; 

    } while (!fFinishRead); // Repeat loop if ERROR_MORE_DATA 
CloseHandle(hFile); 

Répondre

1

avec le serveur & NamedPipeStreams Client vous devez vous assurer au moins une extrémité de la connexion tente lire à tout moment, sinon les écritures échoueront. Je suppose que c'est un problème de synchronisation entre votre serveur & client autour de celui qui écoute/écrit. Voici un quick blog post expliquant ce comportement aussi bien.

Je recommanderais d'utiliser deux flux sur le serveur client &, à la fois lecture/écriture à partir du même canal.

+0

Merci, maintenant je comprends pourquoi ça ne marche pas! Je pense que je vais utiliser 2 flux comme recommandé! – darkheir