7

現在、ASP.NET 3.5 と C# を使用して、Windows の名前付きパイプについて学習しています。名前付きパイプを作成する小さなサーバー プログラムを作成しました。

using (NamedPipeServerStream pipeStream = new NamedPipeServerStream(pipeName))
{
  pipeStream.WaitForConnection();
  // do sth.
}

クライアント アプリケーションは次のようにパイプを開きます。

using (NamedPipeClientStream pipeStream = new NamedPipeClientStream(pipeName))
{ 
  pipeStream.Connect();
  // do sth.
}

これは、パイプに接続するクライアントが 1 つだけである限り、うまく機能します。読み取りと書き込みの両方が可能です。2 番目のクライアントに接続しようとすると、コードが 1 行を超えることはありません

pipeStream.Connect();

サーバーとすべてのクライアントの両方が同じマシンで実行されています。何か案は?

事前にどうもありがとうございました!

4

4 に答える 4

4

ここでいくつかの情報を調べることができます: Number of Clients that can connect to a Named Pipes

ここMSDN: http://msdn.microsoft.com/en-us/library/aa365594%28VS.85%29.aspx

私が理解していることから、マルチスレッドアプリケーションを作成する必要があります。メインスレッドは将来の接続を担当する必要があり、新しい接続はそれぞれ新しいスレッドで開始する必要があります。

于 2009-10-12T18:47:25.040 に答える
1

素早いヘルプをありがとう。

私はすでに別のスレッドで実際の処理を処理しましたが、それについて言及するのを忘れていました。しかし、同僚が問題を発見しました:

サーバー側に投稿された NamedPipeServerStream-using ブロック内の別の using ブロックで囲まれた StreamReader がありました。

このブロックが StreamReader のクローズを完了すると、何らかの理由で NamedPipeServerStream も切断されました。また、 pipeStream.WaitForConnection() をループで囲んでいませんでした。

于 2009-10-12T20:26:48.863 に答える
0

.NET でマルチスレッド パイプ サーバーを実装する方法については、こちらの回答を参照してください。

于 2011-02-20T02:23:38.340 に答える
0

実際のパイプ (ハードウェア ストアのパイプ) には 2 つの終端があります。したがって、名前付きパイプにも、サーバー プロセス用とクライアント プロセス用の 2 つのエンドポイントがあると予想されます。

ただし、最終的な答えが何であれ、WCF を確認することをお勧めします。これは、ネット パイプ バインディング (および構成を変更するだけで WS-* 仕様の有無にかかわらず、バイナリ TCP、SOAP などの他の多くのもの) をサポートし、ハンドルします。サーバーのアクティブ化とマルチスレッド化。.net 3.5 が利用できるので、私は間違いなくそれを選びます。

于 2009-10-12T20:01:19.320 に答える