Windows ソケット : アーカイブ付きソケットの動作
この技術情報では、 Windows ソケットを使用してデータを送受信処理を簡単にするために CSocket のオブジェクト、 CSocketFile のオブジェクトと CArchive のオブジェクトを結合する方法を示しています。
技術情報 Windows ソケット: アーカイブを使用してソケットの例 は PacketSerialize の関数を示します。MFC の Serialize 関数に渡されるアーカイブ オブジェクトと同じように PacketSerialize 例の作業のアーカイブ オブジェクト。必要な違いは CFile の標準のオブジェクト (通常、ディスク ファイルに関連付けられている) CSocketFile のオブジェクトにソケットの場合、アーカイブ関連してありません。ディスク ファイルに接続するのではなく、 CSocketFile のオブジェクトは CSocket にオブジェクトを接続します。
CArchive のオブジェクトはバッファーを管理します。保存の送信 ()のアーカイブ バッファーが完了すると、 CFile の関連するオブジェクトはバッファーの内容を書き出します。ソケットに接続されているのアーカイブ バッファーをフラッシュにメッセージを送信することと同じです。読み込み、 ()のアーカイブ バッファーが完了すると、 CFile のオブジェクトはバッファーが再び使用できるようになるまで読み取りを停止します。
クラス CSocketFile は CFileから派生しますが、配置関数 (Seek、 GetLength、 SetLengthなど)、ロック機能 (LockRange、 UnlockRange)、または GetPosition の関数のような CFile のメンバー関数をサポートしていません。CSocketFile のすべてのオブジェクトは記述することですまたはバイトのシーケンスを関連する CSocket にアーカイブから読み取るために作成します。ファイルが複雑ではないため、 Seek のような操作と GetPosition は意味がありません。CSocketFile は CFileから派生しているため、通常、これらのメンバー関数をすべて継承します。これを回避するには、 CFile でサポートされていないメンバー関数は CSocketFile で CNotSupportedExceptionをスローするようにオーバーライドされます。
CSocket の CSocketFile のオブジェクトの呼び出しのメンバー関数は、データの送信、受信する場合。
次の図は、通信の両側でこれらのオブジェクトの関係を示しています。
CArchive、CSocketFile、CSocket
この Express 複雑さのオブジェクトは、ソケット詳細の管理のための独自に保護することです。ソケット、ファイル、およびアーカイブを作成し、それをアーカイブに挿入するか、アーカイブから抽出して、データの送信、受信を開始します。CArchive、 CSocketFileと CSocket は詳細をバックグラウンドで管理します。
CSocket のオブジェクトは実際に都道府県のオブジェクトです: 2 、 (通常の状態)、同期および非同期。非同期場合、ソケットでは、フレームワークから非同期通知を受け取ることができます。ただし、データにソケットを受け取るか、送信などの操作中に同期になります。これは、同期操作が完了するまでソケットがそれ以上の非同期通知を受信しなかったことを意味します。これがモードを切り替えるため、たとえば次のようにすることができます:
void CMySocket::OnReceive(int nErrorCode)
{
if (0 == nErrorCode)
{
CSocketFile file(this);
CArchive ar(&file, CArchive::load);
CString str;
ar >> str;
}
}
前の通知を処理する場合に 2 都道府県のオブジェクト、イベントの同じ種類の追加の通知を受信できる場合があります。ように CSocket が実装されない場合。たとえば OnReceiveの処理中に、 OnReceive の通知を受け取る場合があります。上のコード片では、アーカイブから str を抽出再帰が発生する場合があります。状態を変更することによって、 CSocket は、追加の通知を防ぐことで、再帰なります。一般的な規則は、通知内の通知ではありません。
[!メモ]
CSocketFile は、 CArchive のオブジェクトを持たないように、 (制限)ファイルを使用できます。既定では、 CSocketFile のコンストラクターの bArchiveCompatible パラメーターは TRUEです。これは、ファイル オブジェクトがアーカイブで使用されることを指定します。アーカイブせずにファイル オブジェクトを使用するには、 bArchiveCompatible パラメーターの FALSE を渡します。
「アーカイブ」互換性のあるのモードでは、 CSocketFile のオブジェクトは方がパフォーマンスを提供し、 「デッドロックの危険性を減らします」。デッドロックは送信と受信ソケットが互いに待機する、またはが発生するのは、共通のリソースを待機します。この状況は CSocketFile を使用する CArchive のオブジェクト CFile のオブジェクトとする方法にも発生することがあります。CFileを使用すると、アーカイブが一部のバイトを受け取った場合は、ファイルの終端到達した要求したと判断できます。ただし、 CSocketFileしてデータは、メッセージです。; バッファーは要求されたバイト数がファイルの終端を意味するわけより少なくを複数のメッセージため、受信を含めることができます。アプリケーションはバッファーが空になるまで CFileな場合もあります。、バッファーからメッセージを読み取りを継続できるようにこの場合、ブロックします。CArchive の IsBufferEmpty 関数は、のアーカイブ バッファーの状態をそのような場合には、監視するのに役立ちます。
詳細については、 Windows ソケット: アーカイブを持つソケットを使用するを参照してください。