System.IO.Exception: труба сломана - PullRequest
21 голосов
/ 22 мая 2009

У меня есть два .NET-приложения, которые общаются друг с другом по именованному каналу. Все отлично с первого раза, но после того, как первое сообщение отправлено, и сервер снова будет прослушивать, метод WaitForConnection() выдает System.IO.Exception с сообщением Труба разорвана.
Почему я получаю это исключение здесь? Я впервые работаю с трубами, но в прошлом аналогичная схема работала для меня с сокетами.

Кодекс ахой!
Сервер:

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

Клиент:

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

При первом вызове sendDownPipe сервер печатает отправленное мною сообщение, но когда он возвращается в очередь для повторного прослушивания, он выдает сообщение.

Ответы [ 2 ]

19 голосов
/ 22 мая 2009

Я опубликую свой код, который, кажется, работает - мне было любопытно, поскольку я никогда ничего не делал с конвейерами. Я не нашел класс, который вы называете для серверной стороны, в соответствующем пространстве имен, поэтому вот код, основанный на NamedPipeServerStream . Функция обратного вызова только потому, что я не мог быть обеспокоен двумя проектами.

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

И клиент делает это:

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

Я могу повторить вышеуказанный блок несколько раз при работающем сервере, без проблем.

8 голосов
/ 28 февраля 2012

Проблема для меня возникла, когда я вызываю pipe.WaitForConnection () с сервера после того, как клиент отключился. Решение состоит в том, чтобы перехватить IOException и вызвать pipe.Disconnect (), а затем снова вызвать pipe.WaitForConnection ():

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