22

名前付きパイプを介して相互に通信する2つの.NETアプリケーションがあります。最初はすべてが素晴らしいですが、最初のメッセージが送信され、サーバーが再びリッスンしようとすると、メソッドはwithメッセージを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を最初に呼び出すと、サーバーは私が送信したメッセージを正常に出力しますが、ループバックして再度リッスンすると、うんちをします。

4

3 に答える 3

20

うまくいくように見えるコードを投稿します-パイプで何もしなかったので興味がありました。関連する名前空間でサーバー側に指定したクラスが見つかりませんでした。そのため、NamedPipeServerStreamに基づくコードを次に示します。コールバックは、2つのプロジェクトに煩わされることができなかったからです。

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

サーバーが稼働している状態で、上記のブロックを複数回繰り返すことができます。問題はありません。

于 2009-05-21T22:49:51.420 に答える
12

クライアントが切断された後、サーバーからpipe.WaitForConnection()を呼び出すと、問題が発生しました。解決策は、IOExceptionをキャッチし、pipe.Disconnect()を呼び出してから、pipe.WaitForConnection()を再度呼び出すことです。

while (true)
{
    try
    {
        _pipeServer.WaitForConnection();
        break;
    }
    catch (IOException)
    {
        _pipeServer.Disconnect();
        continue;
    }            
 }
于 2012-02-28T15:21:54.537 に答える
-3

同じ問題が発生しました。これは、サーバーのStreamReaderをUseing ... End Usingによって破棄したために発生し、NamedPipeServerStreamも停止します。解決策は、単に使用しないことです...使用を終了し、ガベージコレクターを信頼します。

于 2019-10-29T10:46:54.553 に答える