2009-05-21 22 views
16

Ho due applicazioni .NET che comunicano tra loro su una named pipe. Tutto è perfetto la prima volta, ma dopo che il primo messaggio è stato inviato, e il server sta per ascoltare di nuovo, il metodo WaitForConnection() genera un messaggio . Il tubo è rotto.
Perché sto ricevendo questa eccezione qui? Questa è la prima volta che lavoro con i tubi, ma un modello simile ha funzionato per me in passato con le prese.System.IO.Exception: Pipe è rotto

Codice ahoy!
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); 
    } 
} 

Cliente:

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

La prima chiamata a sendDownPipe ottiene il server per stampare il messaggio che viene inviato bene, ma quando si ritorna indietro fino ad ascoltare di nuovo, poppe.

+0

Penso che il motivo si stanno avendo questo problema è a causa della linea "new StreamReader (tubo)". L'ambito del lettore di stream creato è il primo ciclo while e viene quindi ricreato. Tuttavia, il comportamento dei lettori di stream è quello di chiudere il flusso che stanno eseguendo il wrapping, quindi una volta fuori portata chiuderà il flusso del tubo. Puoi provare a spostare la sua dichiarazione fuori dal ciclo while e controllare (P.S: Non ho provato personalmente se il codice funziona se lo fai - volevo semplicemente aggiungere un commento piuttosto che una risposta) – user3141326

risposta

16

Inserirò il mio codice che sembra funzionare - ero curioso dal momento che non ho mai fatto niente con le pipe. Non ho trovato la classe che tu chiami per il lato server nello spazio dei nomi pertinente, quindi ecco il codice basato su NamedPipeServerStream. La roba di callback è solo perché non potevo essere disturbato da due progetti.

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(); 
    } 
} 

E il cliente fa questo:

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

posso ripetere sopra blocco più volte con il server in esecuzione, senza prob.

+0

Questo ha fatto il trucco. Immagino che non ci sia una disconnessione implicita quando un cliente cade dall'altra parte. Grazie. –

+0

Anche questo mi ha aiutato. Grazie per la magnifica risposta! –

+1

Questo mi dà un errore che la pipe non è collegata su questa linea: 'using (var stream = new StreamWriter (pipe))' – eliah

5

Il problema per me si è verificato quando chiamavo pipe.WaitForConnection() dal server, dopo che il client si disconnetteva. La soluzione è quello di catturare l'IOException e chiamare pipe.Disconnect(), e quindi chiamare pipe.WaitForConnection() di nuovo:

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