web-dev-qa-db-ja.com

非同期/待機パターンを使用して、C#5で拡張性の高いTCP / IPサーバーを作成していますか?

私は、複数のクライアントからの接続を受け入れる必要があるかなり単純なTCP/IPサーバーの設計を任されています。 C#で記述する必要があり、.NET 4.5を使用しています。とは言っても、.NET 4.5におけるTCP/IPサーバー/クライアントのスケーラビリティの現在の「最先端」は何なのかわかりません。

私はこの投稿を見ました: スケーラブルなTcp/Ipベースのサーバーの書き方 。しかし、これは.NET 2.0および3.5に関連しており、非同期/待機パターンについては触れていません。

私はサーバーを「古い方法」で書くことができますが、「新しい方法」が何であるか知りたいです。

  • Socket、TcpClient、またはTcpListenerで新しいAsyncメソッドを使用してC#でスケーラブルなサーバーを作成する最良の方法は何ですか?
  • 新しい非同期メソッドはI/O完了ポートを利用しますか?
  • 独自のソケットリスナーをロールする方が効率的ですか、それともTcpListener/TcpClientクラスはかなり良いですか?

編集:追加の質問。

25
Ben Lesh

Socket、TcpClient、またはTcpListenerで新しいAsyncメソッドを使用してC#でスケーラブルなサーバーを作成する最良の方法は何ですか?

asyncには新しいSocketメソッドはありません。 Socket*Asyncという名前のメソッドは、メモリ使用量を削減するための特別なAPIセットです。 TcpClientおよびTcpListenerは、いくつかの新しいasyncメソッドを取得しました。

最高のスケーラビリティが必要な場合は、おそらく Stephen ToubのSocket のカスタムウェイターを使用するのが最適です。コーディングを最も簡単にしたい場合は、TcpClientTcpListenerを使用したほうがよいでしょう。

新しい非同期メソッドはI/O完了ポートを利用しますか?

はい、BCLの他のほとんどの非同期APIと同様です。申し訳ありませんが、Streamクラスは、IOCPを使用しない可能性がある唯一のクラスです。他のすべての*Begin/*End/*AsyncメソッドはIOCPを使用します。

独自のソケットリスナーをロールする方が効率的ですか、それともTcpListener/TcpClientクラスはかなり良いですか?

クラスはそのままでかなり良いです。 Stephen Toubには ブログ投稿 があり、メモリ使用の点で少し効率的です。

11
Stephen Cleary

.net4.5では、async/awaitキーワードを使用してTCPサーバーを構築できます。これがサンプルコードです。 async await tcp server

10K以上の接続を受け入れることができます。 tcp server

3
Jianchen Ding