Windows ソケット: CAsyncSocket クラスの使い方

この記事では、CAsyncSocket クラスの使用方法を説明します。 このクラスは、Windows ソケット API を非常に低レベルでカプセル化します。 CAsyncSocket は、ネットワーク通信の詳しい知識があり、ネットワーク イベントの通知用のコールバックの利便性を求めているプログラマが使用するためのものです。 この前提に基づいて、この記事では基本的な手順のみを説明します。 Windows ソケットを使用して、柔軟性を犠牲にせずに、MFC アプリケーションで複数のネットワーク プロトコルを簡単に処理できるようにしたい場合は、CAsyncSocket を使用することを検討するとよいでしょう。 また、CSocket クラスのより一般的な代替モデルを使用するよりも、通信を自分で直接プログラミングする方が効率的な場合もあります。

CAsyncSocket は、MFC リファレンスに記載されています。 Visual C++ では、Windows SDK にある Windows ソケット仕様も提供しています。 詳細は各自で確認してください。 Visual C++ では、CAsyncSocket のサンプル アプリケーションは提供されません。

ネットワーク通信に関する十分な知識がなく、単純なソリューションが必要な場合は、CSocket クラスを CArchive オブジェクトと共に使用します。 詳細については、「Windows ソケット: アーカイブ付きソケットの使用」を参照してください。

この記事には、次の内容が含まれます。

CAsyncSocket の作成と使用

CAsyncSocket を使用するには

  1. CAsyncSocket オブジェクトを構築し、そのオブジェクトを使用して基になる SOCKET ハンドルを作成します。

    ソケットの作成は、2 段階で構築する MFC パターンに従います。

    次に例を示します。

    CAsyncSocket sock;
    sock.Create(); // Use the default parameters
    

    または

    CAsyncSocket *pSocket = new CAsyncSocket;
    int nPort = 27;
    pSocket->Create(nPort, SOCK_DGRAM);
    

    上記の最初のコンストラクターは、CAsyncSocket オブジェクトをスタック上に作成します。 2 番目のコンストラクターは、CAsyncSocket をヒープ上に作成します。 上記の最初の Create の呼び出しでは、既定のパラメーターを使用してストリーム ソケットを作成します。 2 番目の Create の呼び出しでは、指定されたポートとアドレスを使用してデータグラム ソケットを作成します (構築方法と Create のバージョンはどちらを使用してもかまいません)。

    Create のパラメーターは次のとおりです。

    • "port": 短整数。

      サーバー ソケットの場合、ポートを指定する必要があります。 クライアント ソケットの場合は、通常、このパラメーターの既定値をそのまま使用します。これにより、Windows ソケットによってポートが選択されます。

    • ソケットの種類: SOCK_STREAM (既定値) または SOCK_DGRAM

    • ソケット "アドレス" ("ftp.microsoft.com""128.56.22.8" など)。

      これは、ネットワーク上のインターネット プロトコル (IP) アドレスです。 おそらく、このパラメーターの既定値を常に使用することになるでしょう。

    "ポート" および "ソケット アドレス" という用語については、「Windows ソケット: ポートとソケット アドレス」で説明しています。

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

    または

    ソケットがサーバーの場合は、クライアントからの接続試行のリッスン (CAsyncSocket::Listen を使用) を開始するようにソケットを設定します。 接続要求を受け取ったら、CAsyncSocket::Accept を使用して受け入れます。

    接続を受け入れた後、パスワードの検証などのタスクを実行できます。

    Note

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

  3. Windows ソケット API 関数をカプセル化する CAsyncSocket オブジェクトのメンバー関数を呼び出して、他のソケットとの通信を実行します。

    Windows ソケット仕様および MFC リファレンスの「CAsyncSocket クラス」を参照してください。

  4. CAsyncSocket オブジェクトを破棄します。

    ソケット オブジェクトをスタック上に作成した場合、含まれている関数がスコープ外になると、デストラクターが呼び出されます。 new 演算子を使用して、ソケット オブジェクトをヒープ上に作成した場合は、delete 演算子を使用してオブジェクトを破棄する必要があります。

    デストラクターは、オブジェクトを破棄する前に、オブジェクトの Close メンバー関数を呼び出します。

コード (実際には CSocket オブジェクト) のこのシーケンスの例については、「Windows ソケット: 動作シーケンス」を参照してください。

CAsyncSocket に関するプログラマの責任

CAsyncSocket クラスのオブジェクトを作成すると、そのオブジェクトによって Windows SOCKET ハンドルがカプセル化され、そのハンドルに対する操作が提供されます。 CAsyncSocket を使用するときは、API を直接使用する場合に直面する可能性のあるすべての問題に対処する必要があります。 次に例を示します。

  • "ブロッキング" のシナリオ。

  • 送信側と受信側のマシンのバイト順の違い。

  • Unicode 文字列とマルチバイト文字セット (MBCS) 文字列間の変換。

これらの用語の定義と追加情報については、「Windows ソケット: ブロッキング」、「Windows ソケット: バイトの順序付け」、「Windows ソケット: 文字列の変換」を参照してください。

これらの問題はありますが、アプリケーションに、実現可能な柔軟性と制御がすべて必要な場合は、CAsyncSocket クラスが適切な選択肢と考えられます。 そうでない場合は、代わりに CSocket クラスを使用することを検討してください。 CSocket では、多くの詳細が隠されます。呼び出しのブロック中に Windows メッセージをポンプし、バイト順の違いと文字列変換を自動的に管理する CArchive へのアクセスが提供されます。

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

関連項目

MFC における Windows ソケット