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.

È stato utile?

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;
    }            
 }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top