Windows ソケット : CAsyncSocket クラスの使い方
更新 : 2007 年 11 月
ここでは、CAsyncSocket クラスの使い方について説明します。このクラスは、Windows ソケット API を非常に低いレベルでカプセル化します。CAsyncSocket は、ネットワーク通信に関する知識が深いプログラマ向けであり、ネットワーク イベントの通知用にコールバックを使う場合に使います。このようなプログラマを対象としているので、ここでは基本的な内容を説明します。CAsyncSocket を使うと、柔軟性を損なわずに、Windows ソケットによって MFC アプリケーションにおける複数のネットワーク プロトコルの操作を簡略化できます。通信処理を直接プログラミングした方が、CSocket クラスの汎用的な代替モデルを使うより、効率的な場合もあります。
CAsyncSocket については、『MFC リファレンス』で説明されています。また、Visual C++ では、Windows SDK に Windows ソケットの仕様に関するトピックも用意されています。 Visual C++ には、CAsyncSocket のサンプル アプリケーションは用意されていません。
ネットワーク通信についてあまり知識がなく、簡単な方法が好ましい場合は、CArchive オブジェクトと共に CSocket クラスを使ってください。詳細については、「Windows ソケット : アーカイブ付きソケットの使用」を参照してください。
ここでは、以下の内容について説明します。
CAsyncSocket オブジェクトの作成と使用
CAsyncSocket 使用時の操作
CAsyncSocket オブジェクトの作成と使用
CAsyncSocket を使うには
CAsyncSocket オブジェクトを生成し、このオブジェクトを使って基になる SOCKET ハンドルを作成します。
ソケットは、MFC の 2 段階の生成手順で作成します。
次に例を示します。
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 は以下のパラメータを使用します。
"ポート": short 型整数
サーバー ソケットの場合は、ポートを必ず指定します。クライアント ソケットの場合は、通常このパラメータの既定値を使い、Windows ソケットにポートを選択させます。
ソケット タイプ : SOCK_STREAM (既定) または SOCK_DGRAM
ソケット "アドレス" ("ftp.microsoft.com"、"128.56.22.8" など)
ネットワーク上の自分のインターネット プロトコル (IP) アドレスを指定します。通常は、このパラメータの既定値を使います。
"ポート" と "ソケット アドレス" については、「Windows ソケット : ポートとソケット アドレス」を参照してください。
クライアント ソケットの場合は、CAsyncSocket::Connect を使って、ソケット オブジェクトをサーバー ソケットに接続します。
または
サーバー ソケットの場合は、CAsyncSocket::Listen を使って、クライアントからの接続要求を待機します。接続要求を受信したときは、CAsyncSocket::Accept で受け入れます。
接続を受け入れると、パスワードの正当性チェックなどのタスクを実施できます。
メモ : Accept メンバ関数には、新しい空の CSocket オブジェクトへの参照をパラメータとして渡します。Accept を呼び出す前に、このオブジェクトを構築します。このソケット オブジェクトがスコープ外に出ると、接続は解除されます。このソケット オブジェクトを新規作成するときに、Create を呼び出さないでください。例については、「Windows ソケット : 動作シーケンス」を参照してください。
Windows ソケットの API 関数をカプセル化している CAsyncSocket オブジェクトのメンバ関数を呼び出し、ほかのソケットとの通信を実施します。
Windows ソケットの仕様および『MFCリファレンス』の CAsyncSocket クラスを参照してください。
CAsyncSocket オブジェクトを破棄します。
ソケット オブジェクトをスタック上に作成した場合は、含まれる関数がスコープを出ると、デストラクタが呼び出されます。ソケット オブジェクトを new 演算子でヒープ上に作成した場合は、delete 演算子を使ってオブジェクトを破棄します。
デストラクタは、オブジェクトのメンバ関数 Close を呼び出してから、オブジェクトを破棄します。
このシーケンスのコード例 (実際は CSocket オブジェクトの例) については、「Windows ソケット : 動作シーケンス」を参照してください。
CAsyncSocket 使用時の操作
CAsyncSocket クラスのオブジェクトを作成すると、オブジェクトに Windows の SOCKET ハンドルがカプセル化されて、このハンドルに対する操作が提供されます。CAsyncSocket を使うときは、API を直接使うときに発生する問題をすべて自分で処理する必要があります。次に例を示します。
"ブロッキング"
送信コンピュータと受信コンピュータでのバイト順序の違い
Unicode とマルチバイト文字セット (MBCS) 間の文字列の変換
これらの用語の定義と補足情報については、「Windows ソケット : ブロッキング」、「Windows ソケット : バイトの順序付け」、および「Windows ソケット : 文字列の変換」を参照してください。
CAsycnSocket クラスを使うと、アプリケーションを柔軟に制御できます。一方、アプリケーションで柔軟な制御を行う必要がない場合は、CSocket クラスを使用します。CSocket は、多くの細かな処理を自動的に実行します。呼び出しをブロッキングした状態で Windows メッセージを取り出し、バイト順の違いと文字列の変換を管理する CArchive を利用できるようにします。
詳細については、次のトピックを参照してください。