2016-04-08 4 views
1

Ich habe einen C# -Server und einen C++ - Client. Der C# -Server funktioniert einwandfrei, da ich ihn mit einem C# -Client getestet habe und alle Nachrichten vom Client ordnungsgemäß auf den Server übertragen wurden. Bei der Implementierung des C++ - Clients treten jedoch einige Probleme auf.Benannte Pipe-Kommunikation zwischen C# -Server und C++ - Client

Zunächst einmal, das ist meine C# Server:

Task.Factory.StartNew(() => 
       { 
        NamedPipeServerStream server = new NamedPipeServerStream(name); 
        server.WaitForConnection(); 

        StreamReader reader = new StreamReader(server); 

        Console.WriteLine("Client connected"); 

        while (true) 
        { 
         if (reader.ReadLine() != null) 
          Console.WriteLine(reader.ReadLine()); 
        } 
       }); 

Die name Variablen als Parameter an die Methode übergeben werden. My C++ Code ist folgende:

HANDLE hPipe; 
    DWORD dwWritten; 

    hPipe = CreateFile(TEXT("\\\\.\\pipe\\testpipe"), 
     GENERIC_READ | GENERIC_WRITE, 
     0, 
     NULL, 
     OPEN_EXISTING, 
     0, 
     NULL); 
    if (hPipe != INVALID_HANDLE_VALUE) 
    { 
     WriteFile(hPipe, 
      "Hello Pipe\n", 
      12, // = length of string + terminating '\0' !!! 
      &dwWritten, 
      NULL); 

     CloseHandle(hPipe); 
    } 

Die Ausgabe des Servers ist die folgende:

[PIPE] Client connected 
[PIPE] 

Wer jeden Vorschlag bekam? Vielleicht mache ich das alles falsch, da ich bei Pfeifen total neu bin.

Vielen Dank im Voraus.

+0

Haben Sie versucht, die Dateipuffer zu leeren, bevor Sie das Handle auf der C++ - Seite schließen? https://msdn.microsoft.com/en-us/library/windows/desktop/aa364439(v=vs.85).aspx –

+0

Ich habe FlushFileBuffers (hPipe) nach dem Aufruf von WriteFile() aber immer noch nichts hinzugefügt. – Roel

Antwort

1

Es ist schwierig, Code, insbesondere Netzwerkcode, ohne eine gute Minimal, Complete, and Verifiable example zu diagnostizieren, die das Problem zuverlässig reproduziert. Aber Ihre Server-C# -Code mindestens ein eklatantes Problem hat:

while (true) 
{ 
    if (reader.ReadLine() != null) 
     Console.WriteLine(reader.ReadLine()); 
} 

Hier lesen Sie zuerst eine Zeile aus dem Strom, und dann, wenn es nicht null, lesen Sie andere Linie und anzuzeigen. Das bedeutet, dass Sie jede zweite Zeile, die gesendet wird, verwerfen.

Die Schleife sollte wahrscheinlich aussehen wie folgt aus:

string line; 

while ((line = reader.ReadLine()) != null) 
{ 
    Console.WriteLine(line); 
} 

Ich verstehe nicht, wie Sie Ihre C# Client gearbeitet. Vielleicht wurde es auch falsch implementiert und den gewünschten Zeilen mit Leerzeilen vorangestellt, um den Fehler im Servercode auszugleichen.

+0

Das hat das ganze Problem behoben. Ich habe den Code irgendwo auf Codeproject gefunden und angenommen, dass er richtig funktioniert. Vielen Dank. – Roel