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
の作成と使用
CAsyncSocket
を使用するには
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 ソケット: ポートとソケット アドレス」で説明しています。
ソケットがクライアントの場合は、
CAsyncSocket::Connect
を使用してソケット オブジェクトをサーバー ソケットに接続します。または
ソケットがサーバーの場合は、クライアントからの接続試行のリッスン (
CAsyncSocket::Listen
を使用) を開始するようにソケットを設定します。 接続要求を受け取ったら、CAsyncSocket::Accept
を使用して受け入れます。接続を受け入れた後、パスワードの検証などのタスクを実行できます。
Note
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 ソケット: 文字列の変換」を参照してください。
これらの問題はありますが、アプリケーションに、実現可能な柔軟性と制御がすべて必要な場合は、CAsyncSocket
クラスが適切な選択肢と考えられます。 そうでない場合は、代わりに CSocket
クラスを使用することを検討してください。 CSocket
では、多くの詳細が隠されます。呼び出しのブロック中に Windows メッセージをポンプし、バイト順の違いと文字列変換を自動的に管理する CArchive
へのアクセスが提供されます。
詳細については、以下を参照してください: