Windows ソケット: アーカイブ付きソケットの使用Windows Sockets: Using Sockets with Archives

この記事では、 CSocket プログラミングモデルについて説明します。This article describes the CSocket programming model. クラスの CSocket は、 CAsyncSocketクラスよりも高いレベルの抽象化でソケットのサポートを提供します。Class CSocket supplies socket support at a higher level of abstraction than does class CAsyncSocket. CSocket mfc シリアル化プロトコルのバージョンを使用して、MFC の CArchive オブジェクトを介してソケットオブジェクトとの間でデータをやり取りします。CSocket uses a version of the MFC serialization protocol to pass data to and from a socket object through an MFC CArchive object. CSocket は、Windows メッセージのバックグラウンド処理を管理すると同時に、にアクセスできるようにし CArchive ます。これにより、未加工の API またはクラスを使用して自分で行う必要がある通信の多くの側面が管理され CAsyncSocket ます。CSocket provides blocking (while managing background processing of Windows messages) and gives you access to CArchive, which manages many aspects of the communication that you would have to do yourself using either the raw API or class CAsyncSocket.

ヒント

クラスは、 CSocket の便利なバージョンとして単独で使用でき CAsyncSocket ますが、最も単純なプログラミングモデルはオブジェクトで使用することです CSocket CArchiveYou can use class CSocket by itself, as a more convenient version of CAsyncSocket, but the simplest programming model is to use CSocket with a CArchive object.

アーカイブ付きソケットの実装のしくみの詳細については、「 Windows ソケット: アーカイブ付きソケットの動作方法」を参照してください。For more information about how the implementation of sockets with archives works, see Windows Sockets: How Sockets with Archives Work. コード例については、「 Windows ソケット: 操作のシーケンス 」と「 Windows ソケット: アーカイブを使用したソケットの例」を参照してください。For example code, see Windows Sockets: Sequence of Operations and Windows Sockets: Example of Sockets Using Archives. ソケットクラスから独自のクラスを派生させることによって得られる機能の一部については、「 Windows ソケット: ソケットクラスからの派生」を参照してください。For information about some of the functionality you can gain by deriving your own classes from the sockets classes, see Windows Sockets: Deriving from Socket Classes.

注意

確立された (非 MFC) サーバーと通信するように MFC クライアントプログラムを作成している場合は、アーカイブを通じて C++ オブジェクトを送信しないでください。If you are writing an MFC client program to communicate with established (non-MFC) servers, do not send C++ objects through the archive. サーバーが、送信するオブジェクトの種類を認識する MFC アプリケーションでない限り、オブジェクトを受信したり、逆シリアル化したりすることはできません。Unless the server is an MFC application that understands the kinds of objects you want to send, it will not be able to receive and deserialize your objects. MFC 以外のアプリケーションとの通信に関する関連資料については、「 Windows ソケット: バイトの順序付け」を参照してください。For related material on the subject of communicating with non-MFC applications, also see the article Windows Sockets: Byte Ordering.

CSocket プログラミングモデルThe CSocket Programming Model

オブジェクトを使用するには CSocket 、複数の MFC クラスオブジェクトを作成して関連付ける必要があります。Using a CSocket object involves creating and associating together several MFC class objects. 以下の一般的な手順では、各手順はサーバーソケットとクライアントソケットの両方で実行されます。ただし、手順3では、各ソケットの種類に異なるアクションが必要です。In the general procedure below, each step is taken by both the server socket and the client socket, except for step 3, in which each socket type requires a different action.

ヒント

サーバーアプリケーションは、実行時に、通常は最初に準備が完了し、クライアントアプリケーションが接続をシークしたときに "待機中" になります。At run time, the server application usually starts first to be ready and "listening" when the client application seeks a connection. クライアントが接続しようとしたときにサーバーの準備ができていない場合は、通常、後で接続を再試行するためにユーザーアプリケーションが必要になります。If the server is not ready when the client tries to connect, you typically require the user application to try connecting again later.

サーバーソケットとクライアントソケット間の通信を設定するにはTo set up communication between a server socket and a client socket

  1. CSocketオブジェクトを構築します。Construct a CSocket object.

  2. オブジェクトを使用して、基になる ソケット ハンドルを作成します。Use the object to create the underlying SOCKET handle.

    クライアントオブジェクトの場合、 CSocket データグラムソケットが必要でない限り、通常は既定のパラメーターを使用してを 作成する必要があります。For a CSocket client object, you should normally use the default parameters to Create, unless you need a datagram socket. サーバーオブジェクトの場合は CSocket 、呼び出しでポートを指定する必要があり Create ます。For a CSocket server object, you must specify a port in the Create call.

    注意

    CArchive は、データグラムソケットでは機能しません。CArchive does not work with datagram sockets. をデータグラムソケットに対して使用する場合は、アーカイブを使用するのではなく、使用するクラスを使用する CSocket 必要があり CAsyncSocket ます。If you want to use CSocket for a datagram socket, you must use the class as you would use CAsyncSocket, that is, without an archive. データグラムは信頼できない (到着することは保証されず、繰り返しまたは順序が切れている可能性があります) ため、アーカイブによるシリアル化との互換性がありません。Because datagrams are unreliable (not guaranteed to arrive and may be repeated or out of sequence), they are not compatible with serialization through an archive. シリアル化操作が確実かつ順番に完了することを期待しています。You expect a serialization operation to complete reliably and in sequence. をオブジェクトと共にデータグラムに対して使用しようとすると CSocket CArchive 、MFC アサーションは失敗します。If you try to use CSocket with a CArchive object for a datagram, an MFC assertion fails.

  3. ソケットがクライアントの場合は、 CAsyncSocket:: connect を呼び出して、ソケットオブジェクトをサーバーソケットに接続します。If the socket is a client, call CAsyncSocket::Connect to connect the socket object to a server socket.

    または-or-

    ソケットがサーバーの場合は、 CAsyncSocket:: Listen を呼び出して、クライアントからの接続試行のリッスンを開始します。If the socket is a server, call CAsyncSocket::Listen to begin listening for connect attempts from a client. 接続要求を受信したら、 CAsyncSocket:: acceptを呼び出してそれを受け入れます。Upon receiving a connection request, accept it by calling CAsyncSocket::Accept.

    注意

    この Accept メンバー関数は、新しい空のオブジェクトへの参照を CSocket そのパラメーターとして受け取ります。The Accept member function takes a reference to a new, empty CSocket object as its parameter. を呼び出す前に、このオブジェクトを作成する必要があり Accept ます。You must construct this object before you call Accept. このソケットオブジェクトがスコープ外に出ると、接続は閉じられます。If this socket object goes out of scope, the connection closes. Createこの新しいソケットオブジェクトに対してを呼び出さないでください。Do not call Create for this new socket object.

  4. CSocketFileオブジェクトを作成し、オブジェクトを関連付け CSocket ます。Create a CSocketFile object, associating the CSocket object with it.

  5. データの読み込み (受信) または格納 (送信) のために、 CArchive オブジェクトを作成します。Create a CArchive object for either loading (receiving) or storing (sending) data. アーカイブは、オブジェクトに関連付けられてい CSocketFile ます。The archive is associated with the CSocketFile object.

    CArchiveはデータグラムソケットでは動作しないことに注意してください。Keep in mind that CArchive does not work with datagram sockets.

  6. オブジェクトを使用して、 CArchive クライアントとサーバーのソケットの間でデータを渡します。Use the CArchive object to pass data between the client and server sockets.

    特定 CArchive のオブジェクトがデータを1方向に移動するのは、読み込み (受信) または格納 (送信) のいずれかであることに注意してください。Keep in mind that a given CArchive object moves data in one direction only: either for loading (receiving) or storing (sending). 場合によっては、 CArchive データの送信用に1つ、受信確認を受信するための2つのオブジェクトを使用します。In some cases, you will use two CArchive objects: one for sending data, the other for receiving acknowledgments.

    接続を受け入れ、アーカイブを設定したら、パスワードの検証などのタスクを実行できます。After accepting a connection and setting up the archive, you can perform such tasks as validating passwords.

  7. アーカイブ、ソケットファイル、およびソケットオブジェクトを破棄します。Destroy the archive, socket file, and socket objects.

    注意

    クラス CArchive は、 IsBufferEmpty クラスで使用するためのメンバー関数を提供し CSocket ます。Class CArchive supplies the IsBufferEmpty member function specifically for use with class CSocket. たとえば、バッファーに複数のデータメッセージが含まれている場合は、すべてのメッセージが読み取られ、バッファーがクリアされるまでループする必要があります。If the buffer contains multiple data messages, for example, you need to loop until all of them are read and the buffer is cleared. それ以外の場合、受信するデータがあることを示す次の通知は、無期限に遅延される可能性があります。Otherwise, your next notification that there is data to be received may be indefinitely delayed. IsBufferEmptyすべてのデータを確実に取得するには、を使用します。Use IsBufferEmpty to assure that you retrieve all data.

Windows ソケット: 一連の操作 」では、このプロセスの両方の側面をコード例と共に示します。The article Windows Sockets: Sequence of Operations illustrates both sides of this process with example code.

詳細については、次を参照してください。For more information, see:

関連項目See also

MFC における Windows ソケットWindows Sockets in MFC
CSocket:: CreateCSocket::Create