3

誰かが C#/.net 3.5 でネットワーキングを行う方法を学ぶための正しい方向を教えてくれませんか? コードサンプルと説明は大歓迎です。基本的に、非同期/マルチスレッド サーバー/クライアント モデルを実行する方法を探しています。

WinSock を使用して C++ でこれを達成する方法の基本についてはかなり満足していますが、私の研究のすべてが C# でこの概念を把握しているようには見えません。

あなたが提供できる支援に感謝します:)

4

3 に答える 3

16

WCFがニーズを満たしている場合は、一見の価値があります。ZeroCおよびその他の代替のより高いレベルのライブラリが存在します。それ以外の場合は、必要に応じてソケットレベルに近づけるためのいくつかの異なる方法があります。

TcpClient / UdpClient

これらは、基礎となるソケットの周りに比較的薄いラッパーを提供します。基本的に、ソケットを介してストリームを提供します。NetworkStream(BeginReadなど)で非同期メソッドを使用できます。ラッパーはそれほど多くを提供せず、ソケットを直接使用するよりも少し厄介になる傾向があるため、これは好きではありません。

ソケット-選択

これにより、複数のソケットIOを単一のスレッドに多重化するための従来のSelect手法が提供されます。もうお勧めしません。

ソケット-APMスタイル

ソケットの非同期プログラミングモデル(別名IAsyncResult、開始/終了スタイル)は、ソケットを非同期で使用するための主要な手法です。そして、いくつかのバリエーションがあります。基本的に、非同期メソッド(BeginReceiveなど)を呼び出して、次のいずれかを実行します。

  1. 返されたIAsyncResult(ほとんど使用されない)で完了をポーリングします。
  2. IAsyncResultのWaitHandleを使用して、メソッドが完了するのを待ちます。
  3. BeginXXXメソッドに、メソッドの完了時に実行されるコールバックメソッドを渡します。

通常は最も便利な#3が最善の方法です。疑わしい場合は、この方法を使用してください。

いくつかのリンク:

.NET3.5高性能ソケット

.NET 3.5では、イベントを使用する非同期ソケットの新しいモデルが導入されました。「簡略化された」非同期モデル(Socket.SendAsyncなど)を使用します。コールバックを与える代わりに、完了のためにイベントをサブスクライブし、IAsyncResultの代わりにSocketAsyncEventArgsを取得します。アイデアは、SocketAsyncEventArgsを再利用して、ソケットIOにメモリを事前に割り当てることができるということです。高性能のシナリオでは、これはAPMスタイルを使用するよりもはるかに効率的です。さらに、メモリを事前に割り当てると、安定したメモリフットプリント、ガベージコレクションの削減、ピン留めによるメモリホールなどが発生します。これについて心配することは、最も高性能なシナリオでのみ考慮すべきであることに注意してください。

概要

SocketAsyncEventArgs / Asyncメソッドのスタイルを好まない限り、ほとんどの場合、APMスタイルのコールバックメソッドを使用します。WinSockでCompletionPortsを使用したことがある場合は、これらのメソッドの両方が内部でCompletionPortsを使用していることを知っておく必要があります。

于 2008-10-17T01:57:42.050 に答える
2

.NET 3.5 の世界では、ネットワーク用の .NET フレームワークであるWindows Communication Foundationを確実に学習する必要があります。

便利なリンク:

同期操作と非同期操作 (WCF)

WCFタグでタグ付けされたStackOverflowブラウジング投稿で有用なWCF情報を見つけることができます

于 2008-10-17T00:52:44.787 に答える
0

何を重視したいかによります。

機能に集中し、配管はフレームワークに任せたい場合は、Windows Communication Foundation から始めてください。

独自の配管を構築する場合は、System.Net.Sockets.Socketクラスを使用してください。

于 2008-10-17T00:53:53.130 に答える