Windows ソケット: クラスの使用
この記事では、クラス CAsyncSocket
の使用方法について説明します。 このクラスは、非常に低いレベルで Windows ソケット API をカプセル化します。
CAsyncSocket
は、ネットワーク通信の詳細を知っているが、ネットワーク イベントの通知のためのコールバックの利便性を必要とするプログラマが使用します。 この前提に基づいて、この記事では基本的な説明のみを提供します。 MFC アプリケーションで Windows ソケットで複数のネットワーク プロトコルを簡単に処理したいが、柔軟性を犠牲にしたくない場合は、 CAsyncSocket
の使用を検討する必要があります。 また、クラス CSocket
のより一般的な代替モデルを使用するよりも、通信をより直接的にプログラミングすることで、効率を高めることができると感じるかもしれません。
CAsyncSocket
は MFC リファレンスに記載されています。 Visual C++ には、Windows SDK にある Windows ソケット仕様も用意されています。 詳細はユーザーに任されています。 Visual C++ では、 CAsyncSocket
用のサンプル アプリケーションは提供されません。
ネットワーク通信について高度な知識を持っていなくても、簡単なソリューションが必要な場合は、CArchive
オブジェクトでクラス CSocket
を使用します。 詳細については、「 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) アドレスです。 おそらく、このパラメーターの既定値に常に依存します。
"port" と "socket address" という用語は、 Windows ソケット: ポートとソケット アドレスで説明されています。
ソケットがクライアントの場合は、
CAsyncSocket::Connect
を使用して、ソケット オブジェクトをサーバー ソケットに接続します。-又は-
ソケットがサーバーの場合は、クライアントからの接続試行のリッスン (
CAsyncSocket::Listen
) を開始するようにソケットを設定します。 接続要求を受信したら、CAsyncSocket::Accept
で受け入れます。接続を受け入れた後は、パスワードの検証などのタスクを実行できます。
注
Accept
メンバー関数は、新しい空のCSocket
オブジェクトへの参照をパラメーターとして受け取ります。Accept
を呼び出す前に、このオブジェクトを構築する必要があります。 このソケット オブジェクトがスコープ外になると、接続が閉じます。 この新しいソケット オブジェクトのCreate
を呼び出さないでください。 例については、 Windows ソケット: 操作のシーケンスに関する記事を参照してください。Windows Sockets API 関数をカプセル化する
CAsyncSocket
オブジェクトのメンバー関数を呼び出して、他のソケットとの通信を実行します。MFC リファレンスの Windows ソケットの仕様とクラス
CAsyncSocket
を 参照してください。CAsyncSocket
オブジェクトを破棄します。スタック上にソケット オブジェクトを作成した場合、そのデストラクターは、包含関数がスコープ外になったときに呼び出されます。
new
演算子を使用してヒープにソケット オブジェクトを作成した場合は、delete
演算子を使用してオブジェクトを破棄する必要があります。デストラクターは、オブジェクトを破棄する前に、オブジェクトの
Close
メンバー関数を呼び出します。
コード内のこのシーケンスの例 (実際には CSocket
オブジェクトの場合) については、「 Windows ソケット: 操作のシーケンス」を参照してください。
お客様の責任 CAsyncSocket
クラス CAsyncSocket
のオブジェクトを作成すると、オブジェクトは Windows SOCKET
ハンドルをカプセル化し、そのハンドルに対する操作を提供します。
CAsyncSocket
を使用する場合は、API を直接使用する場合に発生する可能性があるすべての問題に対処する必要があります。 例えば次が挙げられます。
"ブロック" シナリオ。
送信側マシンと受信側マシンのバイト順の違い。
Unicode 文字列とマルチバイト文字セット (MBCS) 文字列間の変換。
これらの用語の定義と追加情報については、「 Windows ソケット: ブロック、 Windows ソケット: バイト順序付け、 Windows ソケット: 文字列の変換」を参照してください。
これらの問題にもかかわらず、アプリケーションで取得できるすべての柔軟性と制御が必要な場合は、クラス CAsyncSocket
が適切な選択肢になる可能性があります。 そうでない場合は、代わりにクラス CSocket
を使用することを検討してください。
CSocket
多くの詳細が非表示になります。ブロック呼び出し中に Windows メッセージをポンプし、バイトオーダーの違いと文字列変換を管理する CArchive
にアクセスできます。
詳細については、以下を参照してください。