4

非同期の NamedPipeServerStream の適切で明確な例を見つけようとしていましたが、私に適したものを見つけることができませんでした。

クライアントからのメッセージを非同期的に受け入れる NamedPipe サーバーが必要です。クライアントはシンプルで、私にとっては問題ありません。しかし、サーバーの例が見つからないか、それがどのように機能するかを理解できません。

私が理解しているように、 NamedPipeServerStream オブジェクトを作成する必要があります。これをやろう:

namedPipeServerStream = new NamedPipeServerStream(PIPENAME, PipeDirection.In, 1, PipeTransmissionMode.Byte, PipeOptions.Asynchronous, BUFFERSIZE, BUFFERSIZE);

うまくいくようです。しかし、PipeSecurity または PipeAccessRule をまったく使用する必要があるかどうかはわかりません。私は?私のサーバーは、ローカル システムで Windows サービスとして動作します。

次は何?非同期接続には BeginWaitForConnection を使用する必要があると考えています。どれどれ:

namedPipeServerStream.BeginWaitForConnection(WaitForConnectionAsyncCallback, <some strange thing>);

質問 1 : この「奇妙なもの」とは何ですか? それの使い方?

質問 2 : やるべきですか

while(true)
{
namedPipeServerStream.BeginWaitForConnection(WaitForConnectionAsyncCallback, <some strange thing>);
}

サーバーが常に接続を待機するようにするには? それとも、他の方法でそれを行う必要がありますか?

そして... WaitForConnectionAsyncCallback 関数を見てみましょう:

private void WaitForConnectionAsyncCallback(IAsyncResult result)
        {
            Console.WriteLine("Client connected.");
            byte[] buff = new byte[BUFFERSIZE];
            namedPipeServerStream.Read(buff, 0, namedPipeServerStream.InBufferSize);
            string recStr = General.Iso88591Encoding.GetString(buff, 0, namedPipeServerStream.InBufferSize);
            Console.WriteLine("   " + recStr);
            namedPipeServerStream.EndWaitForConnection(result);
        }

..これはもちろん機能しません。ストリームから文字列を正確に受け取る方法がわからないためです。どのように?InvalidOperationException が発生するようになりました。

パイプはまだ接続されていません。

では、NamedPipeServerStream を使用して非同期作業を整理するにはどうすればよいでしょうか?

4

1 に答える 1

10
  • PipeSecurity をいじって、パイプへのアクセスを制限し、祝福されたプログラムのみがサービスに接続できるようにします。これが機能するようになり、この種の制限が保証されていることを示すセキュリティ分析を実行するまで、それを後回しにしてください。

  • 「奇妙なこと」とは、コールバック メソッドに渡すことができる任意のオブジェクトです。多くの場合は必要ありませんが、複数の接続を提供するようにコールバックを記述すると役立ちます。その場合、接続された特定のパイプについて詳しく知る必要があります。state引数を使用すると、その情報を渡すことができます。コールバック メソッドでは、result.AsyncState プロパティがそのオブジェクトへの参照を返します。後でそれについて心配するだけです。必要なときにその用途が見つかります。nullそれまで通り過ぎてください。

  • それはバグです。パイプで何かを行う前に、最初に EndWaitForConnection() を呼び出す必要があります。メソッドの先頭に移動するだけです。プログラムを終了する前にパイプを閉じたときに発生する例外である ObjectDisposedException をキャッチできるように、通常は try/catch 内に記述します。

于 2012-07-11T15:28:46.410 に答える