次の方法で共有


Windows ソケット : アーカイブ付きソケットの使用

ここでは、CSocket プログラミング モデルについて説明します。 CSocket クラスによるソケットのサポートは、CAsyncSocket クラスによるサポートよりも抽象化されています。 CSocket は、MFC のシリアル化プロトコルを使って MFC の CArchive オブジェクト経由でソケット オブジェクトに対するデータの受け渡しを行います。 CSocket には、Windows メッセージのバックグラウンド処理を管理している間のブロッキング機能があり、CSocket を使うと CArchive にアクセスして通信のさまざまな管理を任せることができます。API を直接使う場合、または CAsyncSocket クラスを使う場合は、自分で管理する必要があります。

ヒント

CSocket クラスは、単独でも CAsyncSocket の代用としても使用できます。しかし、CSocketCArchive オブジェクトを併用して使用すると、プログラミング モデルは最も単純化されます。

ソケットをアーカイブ付きで実装した場合の動作の詳細については、「Windows ソケット : アーカイブ付きソケットの動作」を参照してください。 コード例については、「Windows ソケット : 動作シーケンス」および「Windows ソケット : アーカイブを使用するソケットの例」を参照してください。 ソケット クラスから派生させた独自のクラスで利用できる機能については、「Windows ソケット : ソケット クラスからの派生」を参照してください。

注意

確立済みの非 MFC サーバーと通信する MFC クライアント プログラムを記述する場合は、C++ オブジェクトをアーカイブ経由で送らないようにしてください。 サーバーは、送出するオブジェクトの種類を認識できる MFC アプリケーションでない限り、このオブジェクトを受信することも逆シリアル化することもできません。 非 MFC アプリケーションとの通信に関する資料については、「Windows ソケット : バイトの順序付け」を参照してください。

CSocket プログラミング モデル

CSocket オブジェクトを使用するには、MFC クラスのオブジェクトの作成、および複数の MFC クラス オブジェクトの関連付けが必要です。 次に示す一般的な手順では、手順 3. 以外の各操作はサーバー ソケットとクライアント ソケットの両方に共通です。手順 3. では、ソケット タイプに応じて別の処理を行います。

ヒント

実行時は通常、サーバー アプリケーションが先に起動し、クライアント アプリケーションからの接続要求を待機します。 クライアントが接続しようとしたときにサーバーが準備できていない場合は、通常、ユーザー アプリケーションで接続を再試行します。

サーバー ソケットとクライアント ソケット間の通信を設定するには

  1. CSocket オブジェクトを生成します。

  2. このオブジェクトを使って、基になる SOCKET ハンドルを作成します。

    CSocket クライアント オブジェクトの場合は、通常、既定のパラメーターを使って Create を呼び出します。ただし、データグラム ソケットが必要な場合は別です。 CSocket サーバー オブジェクトの場合は、ポートを指定して Create を呼び出します。

    注意

    CArchive は、データグラム ソケットでは機能しません。 データグラム ソケットに対して CSocket を使う場合は、CAsyncSocket を使う場合と同じようにアーカイブなしで使用する必要があります。 データグラムは信頼性が低く、必ず到着するとは限らず、重複することもシーケンスが前後することもあるので、アーカイブを使ったシリアル化には対応できません。 シリアル化操作は、確実に順番どおりに行う必要があります。 データグラムに対して CSocketCArchive オブジェクトを併用すると、MFC のアサーションが失敗します。

  3. クライアント ソケットの場合は、CAsyncSocket::Connect を呼び出して、ソケット オブジェクトをサーバー オブジェクトに接続します。

    または

    サーバー オブジェクトの場合は、CAsyncSocket::Listen を呼び出して、クライアントからの接続要求を待機します。 接続要求を受信したときは、CAsyncSocket::Accept を呼び出して受け入れます。

    注意

    Accept メンバー関数には、新しい空の CSocket オブジェクトへの参照をパラメーターとして渡します。 Accept を呼び出す前に、このオブジェクトを構築します。 このソケット オブジェクトがスコープ外に出ると、接続は解除されます。 このソケット オブジェクトを新規作成するときに、Create を呼び出さないでください。

  4. CSocketFile オブジェクトを作成し、CSocket オブジェクトに関連付けます。

  5. データの読み込み (受信) 用または格納 (送信) 用の CArchive オブジェクトを作成します。 このアーカイブを CSocketFile オブジェクトに関連付けます。

    CArchive でデータグラム ソケットを扱うことはできません。

  6. CArchive オブジェクトを使って、クライアント ソケットとサーバー ソケット間でデータをやりとりします。

    心に留めては、与えられたCArchiveオブジェクトは、1 つの方向にのみデータを移動します。読み込み (受信) または格納 (送信) のいずれか。 いくつかのケースでは、2 つを使用するCArchiveオブジェクト。1 つは、他の受信確認を受信するためのデータを送信します。

    接続を許可し、アーカイブを設定すると、パスワードの正当性チェックなどの処理を実行できます。

  7. アーカイブ、ソケット ファイル、ソケットの各オブジェクトを破棄します。

    注意

    CArchive クラスが提供するメンバー関数 IsBufferEmpty は、CSocket クラス専用です。 たとえば、バッファーに複数のデータ メッセージがある場合は、処理を繰り返してすべてのデータを読み出してバッファーを空にする必要があります。 バッファーを空にしないと、次のデータ受信通知が無期限に遅れることになります。 IsBufferEmpty を使うと、すべてのデータを確実に取得できます。

Windows ソケット : 動作シーケンス」では、サーバーとクライアントの両方を、コード例を使用して示します。

詳細については、次のトピックを参照してください。

参照

参照

CSocket::Create

概念

MFC における Windows ソケット