次の方法で共有


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

この記事では、 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 を除き、サーバー ソケットとクライアント ソケットの両方によって実行されます。

ヒント

実行時に、通常、サーバー アプリケーションは最初に準備を開始し、クライアント アプリケーションが接続をシークするときに "リッスン" します。 クライアントが接続しようとしたときにサーバーの準備ができていない場合は、通常、ユーザー アプリケーションが後でもう一度接続を試みるように要求します。

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

  1. CSocket オブジェクトを構築します。

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

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

    CArchive は、データグラム ソケットでは機能しません。 データグラム ソケットに CSocket を使用する場合は、 CAsyncSocketを使用する場合と同様に、アーカイブなしでクラスを使用する必要があります。 データグラムは信頼性が低いため (到着することは保証されず、繰り返しまたは順序外になる可能性があります)、アーカイブを介したシリアル化と互換性がありません。 シリアル化操作は、確実かつ順番に完了することが期待されます。 データグラムのCArchive オブジェクトでCSocketを使用しようとすると、MFC アサーションは失敗します。

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

    -又は-

    ソケットがサーバーの場合は、 CAsyncSocket::Listen を呼び出して、クライアントからの接続試行のリッスンを開始します。 接続要求を受信したら、 CAsyncSocket::Accept を呼び出して受け入れます。

    Accept メンバー関数は、新しい空の CSocket オブジェクトへの参照をパラメーターとして受け取ります。 Accept を呼び出す前に、このオブジェクトを構築する必要があります。 このソケット オブジェクトがスコープ外になると、接続が閉じます。 この新しいソケット オブジェクトに対して Create を呼び出さないでください。

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

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

    CArchiveはデータグラム ソケットでは機能しないことに注意してください。

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

    特定の CArchive オブジェクトは、読み込み (受信) または格納 (送信) のどちらかの方向にのみデータを移動することに注意してください。 場合によっては、2 つの CArchive オブジェクトを使用します。1 つはデータの送信用、もう 1 つは受信確認を受信するオブジェクトです。

    接続を受け入れてアーカイブを設定したら、パスワードの検証などのタスクを実行できます。

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

    クラス CArchiveは、クラス CSocketで特に使用するために、IsBufferEmpty メンバー関数を提供します。 たとえば、バッファーに複数のデータ メッセージが含まれている場合は、それらすべてが読み取られ、バッファーがクリアされるまでループする必要があります。 それ以外の場合は、受信するデータがあることを示す次の通知が無期限に遅れる可能性があります。 すべてのデータを確実に取得するには、 IsBufferEmpty を使用します。

Windows ソケット: 操作のシーケンスに関する記事では、このプロセスの両側とコード例を示します。

詳細については、以下を参照してください。

こちらも参照ください

MFC の Windows ソケット
CSocket::Create