.Net socketサーバのプログラミングも効率的である理由

3681 ワード

Socketプログラミングといえば、ほとんどの人が手を挙げてc,c++を挙げます.残念ながら今はライトサーバに追随する機会がないので、c#版のSocketサーバを考えてみましょう.
一度調べて、試してみます.いくつかのデータと事実が明らかになったと同時に、c#版のサーバにも自信があり、以下にゆっくりとリストします.
基礎知識:
1、まずsocketはプラットフォームによって2つに分けられます.1つはunixからのwinsockとマイクロソフトプラットフォームからのwinsockです.文資料によると、winsockはunixの下のsocketを参考にしています.
2,プログラミングモードから見ると2種類あり,同期と非同期
3,tcpプロトコルによって短いリンク、長いリンクがあります.
Unixでは、socketはネットワークファイル記述子とも呼ばれ、windowの下で特殊なi/oハンドルと見なされ、これらはシステムリソースです.ネットワークからのリクエストごとにsocketリソースが処理される必要があります.これらのリソースの使用率を向上させることで、サーバのパフォーマンスを向上させることができます.指導思想は:非同期、再利用、マルチスレッド、スレッドプール.これらを融合させたのがIOCPモデルである.
この兄たちの研究するを借りてIOCPを紹介します
1)IOCPモデルを用いたプログラミングの利点1.繰り返し使用するメモリプールを維持するのに役立つ.(オーバーラップI/O技術に関する)②削除スレッド作成/終了負担を取り除く.3管理、スレッドの割り当て、同時制御、最小化のスレッドコンテキスト切替に有利である.④スレッドスケジューリングを最適化し、CPUとメモリバッファのヒット率を高める.
2)IOCPモデルを用いてプログラミングされた知識点(優先順位なし)①同期と非同期②ブロックと非ブロック③オーバーラップI/O技術④マルチスレッド⑤スタック、キューの2つの基本的なデータ構造
 
.Netでのsocketプログラミング:
戻るNet,win 32の下にOverlapped I/Oという技術があります.OVERLPPED I/OはWIN 32の技術で、オペレーティングシステムにデータを転送し、転送が完了したときに通知することができます.このテクノロジーにより、I/Oプロセス中もプログラムがトランザクションを処理し続けることができます.実際、オペレーティングシステム内部では、OVERLPPED I/OがスレッドでI/Oされています.苦痛な代価を払う必要がなく、スレッドのすべての利益を得ることができます.つまり、OVERLPPEDは主に非同期I/O操作を設定し、非同期I/O操作とはアプリケーションがバックグラウンドでデータを読み書きし、フロントで他のことをすることができることを意味する.OVERLPPEDはwinddowsの下の構造体であり、c,c++で中和する.Netでは違います.CLR内のOverlappedオブジェクトは、非同期I/O操作を管理するためのネイティブWindows OVERLPPED構造を効率的にカプセル化することができる.各進行中のSocket非同期I/O操作には、Overlappedオブジェクトインスタンスがあります.MSDNの雑誌で宣城は3.5から始まり、6万個以上の接続ソケットを持つことができ、同時に各ソケットに掛けられた非同期受信I/O操作を維持することができる.
基礎ができたら、公式の説明を見てみましょう.
2.0バージョンのSocketクラスはWindows I/O完了ポートを使用して非同期I/O操作を完了します.これにより、アプリケーションは大量の開いたソケットに簡単に拡張することができる.NET FrameworkはSystemを実現した.Threading.完了ポートを読み取り、非同期I/O操作を完了する完了スレッドを提供するThreadPoolクラス.リリース予定の3.5バージョンを開発しています.NET Frameworkでは、完了ポートの読み取りとアプリケーションを呼び出す完了エージェント、またはIAsyncResultオブジェクトでI/O完了イベントオブジェクト信号を送信するなど、コードパスのオーバーヘッドの除去に多くの力を入れています.
.NET FrameworkのAPMはBegin/Endモードとも呼ばれます.これは、Beginメソッドを呼び出して非同期操作を開始し、IAsyncResultオブジェクトを返すためです.パラメータとしてエージェントをBeginメソッドに提供することを選択でき、非同期操作が完了するとメソッドが呼び出されます.あるいは、スレッドはIAsyncResultを待つことができる.AsyncWaitHandle.コールバックが呼び出されたり、待機信号が発行されたりすると、Endメソッドが呼び出されて非同期動作の結果が得られます.このモードは柔軟で、使用が比較的簡単である.NET Frameworkではよく見かけます.
ただし、非同期ソケット操作を大量に行う場合は、コストがかかることに注意してください.操作のたびにIAsyncResultオブジェクトを作成する必要があります.このオブジェクトは再使用できません.これは、オブジェクトの割り当てとゴミ収集を大量に使用するため、パフォーマンスに影響します.この問題を解決するために、新しいバージョンでは、ソケット上で非同期I/Oを実行する別の方法モードが提供されています.この新しいモードでは、各ソケット操作に操作コンテキストオブジェクトを割り当てる必要はありません.
新しいモードは作成されず、既存のモードを採用し、基本的な変更を行っただけです.イベントベースの完了モデルのバリエーションを使用するSocketクラスにいくつかの方法があります.バージョン2.0では、次のコードを使用して、ソケット上で非同期送信操作を開始できます.
void OnSendCompletion(IAsyncResult ar) { }



IAsyncResult ar = socket.BeginSend(buffer, 0, buffer.Length, 

    SocketFlags.None, OnSendCompletion, state);


新しいバージョンでは、次のことも実行できます.
void OnSendCompletion(object src, SocketAsyncEventArgs sae) { }



SocketAsyncEventArgs sae = new SocketAsyncEventArgs();

sae.Completed += OnSendCompletion;

sae.SetBuffer(buffer, 0, buffer.Length);

socket.SendAsync(sae);


ここには明らかな違いがある.操作コンテキストをカプセル化するのは、IAsyncResultオブジェクトではなくSocketAsyncEventArgsオブジェクトです.このアプリケーションは、SocketAsyncEventArgsオブジェクトを作成し、管理します(再利用することもできます).ソケット操作のすべてのパラメータは、SocketAsyncEventArgsオブジェクトのプロパティとメソッドによって指定されます.完了ステータスもSocketAsyncEventArgsオブジェクトのプロパティによって提供されます.最後に、イベントハンドラコールバック完了メソッドを使用する必要があります.
 
以上の基礎知識に基づいて、c#版のsocketサーバを使う自信があるような気がします.現在、SuperSocketが採用されており、使用が簡単で、公式には有名なユーザーがリストされています.ブログ園では自社の製品を推薦する人もいるようです.見た目も悪くない.
余談ですが、c,c++socketサーバーは爽やかですね.ハンターが40 w以上のポストを出していますが、残念ながらできません.