2009-05-21 4 views
16

Ich habe zwei .NET-Anwendungen, die über eine Named Pipe miteinander kommunizieren. Alles ist großartig beim ersten Mal durch, aber nachdem die erste Nachricht gesendet wird und der Server wieder zu hören ist, wirft die WaitForConnection() Methode eine System.IO.Exception mit Nachricht Pipe ist kaputt.
Warum bekomme ich diese Ausnahme hier? Dies ist das erste Mal, dass ich mit Röhren arbeite, aber ein ähnliches Muster hat in der Vergangenheit mit Sockeln funktioniert.System.IO.Exception: Pipe ist gebrochen

Code ahoi!
Server:

using System.IO.Pipes; 

static void main() 
{ 
    var pipe = new NamedPipeServerStream("pipename", PipeDirection.In); 
    while (true) 
    { 
     pipe.Listen(); 
     string str = new StreamReader(pipe).ReadToEnd(); 
     Console.Write("{0}", str); 
    } 
} 

Auftraggeber:

public void sendDownPipe(string str) 
{ 
    using (var pipe = new NamedPipeClientStream(".", "pipename", PipeDirection.Out)) 
    { 
     using (var stream = new StreamWriter(pipe)) 
     { 
      stream.Write(str); 
     } 
    } 
} 

Der erste Aufruf von sendDownPipe den Server erhält die Nachricht, die ich ganz gut zum Drucken senden, aber wenn es wieder zu hören Schleife zurück, es kackt.

+0

Ich denke, der Grund, warum Sie dieses Problem haben, weil der Linie ist „new Stream (Rohr) ". Der Bereich des erstellten Stream-Readers ist die erste while-Schleife und wird dann neu erstellt. Das Verhalten von Stream-Lesern ist jedoch so, dass sie den Stream, den sie umhüllen, schließen. Wenn der Stream nicht mehr vorhanden ist, wird der Pipe-Stream geschlossen. Sie können versuchen, seine Deklaration aus der While-Schleife zu entfernen und zu überprüfen (S.S: Ich habe nicht persönlich versucht, wenn der Code funktioniert, wenn Sie das tun - wollte nur einen Kommentar hinzufügen und nicht antworten) – user3141326

Antwort

16

Ich poste meinen Code, der zu funktionieren scheint - ich war neugierig, da ich nie etwas mit Rohren gemacht habe. Ich habe die Klasse, die Sie für die Server-Seite in dem relevanten Namespace benennen, nicht gefunden, also ist hier der Code, der auf dem NamedPipeServerStream basiert. Das Callback-Zeug ist nur, weil ich nicht mit zwei Projekten belästigt werden konnte.

NamedPipeServerStream s = new NamedPipeServerStream("p", PipeDirection.In); 
Action<NamedPipeServerStream> a = callBack; 
a.BeginInvoke(s, ar => { }, null); 
... 
private void callBack(NamedPipeServerStream pipe) 
{ 
    while (true) 
    { 
    pipe.WaitForConnection(); 
    StreamReader sr = new StreamReader(pipe); 
    Console.WriteLine(sr.ReadToEnd()); 
    pipe.Disconnect(); 
    } 
} 

Und der Kunde tut dies:

using (var pipe = new NamedPipeClientStream(".", "p", PipeDirection.Out)) 
using (var stream = new StreamWriter(pipe)) 
{ 
    pipe.Connect(); 
    stream.Write("Hello"); 
} 

ich mehrmals über Block mit dem Server läuft wiederholen kann, ohne Prob.

+0

Das hat den Trick gemacht. Ich denke, es gibt keine implizite Trennung, wenn ein Client vom anderen Ende fällt. Vielen Dank. –

+0

Das hat mir auch geholfen. Danke für die tolle Antwort! –

+1

Dies gibt mir einen Fehler, dass die Pipe in dieser Zeile nicht verbunden ist: 'using (var stream = new StreamWriter (pipe))' – eliah

5

Das Problem für mich ist aufgetreten, wenn ich pipe.WaitForConnection() vom Server aufrufen würde, nachdem der Client getrennt wurde. Die Lösung ist, die IOException und rufen pipe.Disconnect() zu fangen, und rufen Sie dann pipe.WaitForConnection() erneut:

while (true) 
{ 
    try 
    { 
     _pipeServer.WaitForConnection(); 
     break; 
    } 
    catch (IOException) 
    { 
     _pipeServer.Disconnect(); 
     continue; 
    }    
}