Windows ソケット: アーカイブ付きソケットの使用
この記事では、 CSocket プログラミング モデルについて説明します。 クラス CSocket は、CAsyncSocket クラスよりも高いレベルの抽象化でソケットのサポートを提供します。 CSocket
は、MFC シリアル化プロトコルのバージョンを使用して、MFC CArchive オブジェクトを介してソケット オブジェクトとの間でデータをやり取りします。 CSocket
は、(Windows メッセージのバックグラウンド処理の管理中に) ブロックを行い、CArchive
にアクセスできるようにします。これにより、未加工の API またはクラス CAsyncSocket
を使用して自分で行う必要がある通信の多くの側面を管理できます。
ヒント
クラス CSocket
は、CAsyncSocket
の便利なバージョンとして単独で使用できますが、最も単純なプログラミングモデルは CArchive
オブジェクトで CSocket
を使用することです。
アーカイブ付きソケットの実装のしくみの詳細については、「Windows ソケット: アーカイブ付きソケットの動作」を参照してください。 コード例については、「Windows ソケット: 操作のシーケンス」と「Windows ソケット: アーカイブを使用するソケットの例」を参照してください。 ソケットクラスから独自のクラスを派生させることによって得られる機能の一部については、「Windows ソケット: ソケットクラスからの派生」を参照してください。
Note
確立された (非 MFC) サーバーと通信するための MFC クライアント プログラムを作成している場合は、アーカイブを介して C++ オブジェクトを送信しないでください。 サーバーは、送信するオブジェクトの種類を理解する MFC アプリケーションでない限り、オブジェクトを受信して逆シリアル化することはできません。 MFC 以外のアプリケーションとの通信に関する関連資料については、「Windows ソケット: バイトの順」を参照してください。
CSocket プログラミング モデル
CSocket
オブジェクトを使用するには、複数の MFC クラス オブジェクトを作成して関連付ける必要があります。 以下の一般的な手順では、各手順はサーバー ソケットとクライアント ソケットの両方で実行されます。ただし、手順 3 では、各ソケット タイプごとに異なるアクションが必要です。
ヒント
サーバー アプリケーションは、実行時に、通常は最初に準備が完了し、クライアント アプリケーションが接続をシークしたときに "リッスン中" になります。 クライアントが接続しようとしたときにサーバーの準備ができていない場合は、通常、後で接続を再試行するためにユーザー アプリケーションが必要になります。
サーバー ソケットとクライアント ソケット間の通信を設定するには
CSocket オブジェクトを構築します。
オブジェクトを使用して、基になる SOCKET ハンドルを作成します。
CSocket
クライアント オブジェクトの場合、データグラム ソケットが必要でない限り、通常は既定のパラメーターを使用して作成する必要があります。CSocket
サーバー オブジェクトの場合は、Create
呼び出しでポートを指定する必要があります。Note
CArchive
は、データグラム ソケットでは機能しません。CSocket
をデータグラム ソケットに対して使用する場合は、アーカイブを使用するのではなく、CAsyncSocket
を使用するクラスを使用する必要があります。 データグラムは信頼できない (到着することは保証されず、繰り返しまたは順序が切れている可能性があります) ため、アーカイブによるシリアル化との互換性がありません。 シリアル化操作が確実かつ順番に完了することを期待しています。CSocket
をCArchive
オブジェクトと共 にデータグラムに対して使用しようとすると、MFC アサーションは失敗します。ソケットがクライアントの場合は、CAsyncSocket::Connect を呼び出して、ソケット オブジェクトをサーバー ソケットに接続します。
または
ソケットがサーバーの場合は、 CAsyncSocket::Listen を呼び出して、クライアントからの接続試行のリッスンを開始します。 接続要求を受信したら、CAsyncSocket::accept を呼び出してそれを受け入れます。
Note
Accept
メンバー関数は、新しい空のCSocket
オブジェクトへの参照をパラメーターとして受け取ります。Accept
を呼び出す前に、このオブジェクトを構築する必要があります。 このソケット オブジェクトがスコープ外になると、接続が閉じられます。 この新しいソケット オブジェクトに対してCreate
を呼び出さないでください。CSocketFile オブジェクトを作成し、
CSocket
オブジェクトを関連付けます。データの読み込み (受信) または格納 (送信) のために、 CArchive オブジェクトを作成します。 アーカイブは、
CSocketFile
オブジェクトに関連付けられています。CArchive
はデータグラム ソケットでは動作しないことに注意してください。CArchive
オブジェクトを使用して、クライアントとサーバーのソケットの間でデータを渡します。特定
CArchive
オブジェクトがデータを 1 方向に移動するのは、読み込み (受信) または格納 (送信) のいずれかであることに注意してください。 場合によっては、データの送信用に 1 つ、受信確認を受信する用に 1 つの 2 つCArchive
オブジェクトを使用します。接続を受け入れ、アーカイブを設定したら、パスワードの検証などのタスクを実行できます。
アーカイブ、ソケット ファイル、およびソケット オブジェクトを破棄します。
Note
クラス
CArchive
は、CSocket
クラスで使用するためのIsBufferEmpty
メンバー関数を提供します。 たとえば、バッファーに複数のデータメッセージが含まれている場合は、すべてのメッセージが読み取られ、バッファーがクリアされるまでループする必要があります。 それ以外の場合、受信するデータがあることを示す次の通知は、無期限に遅延される可能性があります。 すべてのデータを確実に取得するには、IsBufferEmpty
を使用します。
この記事「Windows ソケット: 操作のシーケンス」は、このプロセスの両方の側面をコード例と共に示しています。
詳細については、以下を参照してください: