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