System.IO.Exception: Pipe è rotto
-
23-08-2019 - |
Domanda
Ho due NET applicazioni che parlano tra loro su una named pipe. Tutto è grande la prima volta attraverso, ma dopo il primo messaggio viene inviato, e il server sta per riascoltare, il metodo WaitForConnection()
lancia un System.IO.Exception
con il messaggio Pipe è rotto.
Perché mi appare questa eccezione qui? Questa è la mia prima volta a lavorare con i tubi, ma un modello simile ha funzionato per me in passato con prese.
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.
Soluzione
Vi posto il mio codice che sembra funzionare - Ero curioso dal momento che non ho mai fatto niente con i tubi. Non ho trovato la classe è il nome per il lato server nello spazio dei nomi in questione, quindi ecco il codice in base alla NamedPipeServerStream . La roba è richiamata solo perché non poteva essere disturbato con 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 client 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.
Altri suggerimenti
Il problema per me è verificato quando io definirei pipe.WaitForConnection () dal server, dopo che il client disconnesso. 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;
}
}