次の方法で共有


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

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

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

ネットワーク通信について高度な知識を持っていなくても、簡単なソリューションが必要な場合は、CArchive オブジェクトでクラス CSocketを使用します。 詳細については、「 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) アドレスです。 おそらく、このパラメーターの既定値に常に依存します。

    "port" と "socket address" という用語は、 Windows ソケット: ポートとソケット アドレスで説明されています。

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

    -又は-

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

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

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

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

    MFC リファレンスの Windows ソケットの仕様とクラス 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 ソケット