この記事では、サーバー ソケットとクライアント ソケットに対する一連の操作を並べて示します。 ソケットは CArchive
オブジェクトを使用するため、必ずしも ストリーム ソケットです。
ストリーム ソケット通信の一連の操作
CSocketFile
オブジェクトを構築する時点まで、次のシーケンスは、CAsyncSocket
とCSocket
の両方で正確です (いくつかのパラメーターの違いがあります)。 その時点から、シーケンスは厳密に CSocket
用です。 次の表は、クライアントとサーバー間の通信を設定するための一連の操作を示しています。
サーバーとクライアント間の通信の設定
サーバー | 顧客 |
---|---|
// construct a socket CSocket sockSrvr; |
// construct a socket CSocket sockClient; |
// create the SOCKET sockSrvr.Create(nPort); 1,2 |
// create the SOCKET sockClient.Create( ); 2 |
// start listening sockSrvr.Listen( ); |
|
// seek a connection sockClient.Connect(strAddr, nPort); 3,4 |
|
// construct a new, empty socket CSocket sockRecv; // accept connection sockSrvr.Accept( sockRecv ); 5 |
|
// construct file object CSocketFile file(&sockRecv); |
// construct file object CSocketFile file(&sockClient); |
// construct an archive CArchive arIn(&file, CArchive::load); -又は- CArchive arOut(&file, CArchive::store); - または両方 - |
// construct an archive CArchive arIn(&file, CArchive::load); -又は- CArchive arOut(&file, CArchive::store); - または両方 - |
// use the archive to pass data: arIn >> dwValue; -又は- arOut << dwValue; 6 |
// use the archive to pass data: arIn >> dwValue; -又は- arOut << dwValue; 6 |
ここで、nPort はポート番号です。 ポートの詳細については、「 Windows ソケット: ポートとソケット アドレス 」を参照してください。
クライアントが接続できるように、サーバーは常にポートを指定する必要があります。
Create
呼び出しでは、アドレスも指定される場合があります。 クライアント側では、既定のパラメーターを使用します。このパラメーターは、MFC に使用可能なポートを使用するように求めます。ここで、nPort はポート番号、strAddr はマシン アドレスまたはインターネット プロトコル (IP) アドレスです。
マシン アドレスには、"ftp.microsoft.com"、"microsoft.com" という形式を使用できます。 IP アドレスでは、"ドット番号" 形式 "127.54.67.32" が使用されます。
Connect
関数は、アドレスが点線の数値であるかどうかを確認します (ただし、ネットワーク上の有効なマシンであることを確認しません)。 そうでない場合、Connect
は他のいずれかの形式のマシン名を想定します。サーバー側で
Accept
を呼び出すときに、新しいソケット オブジェクトへの参照を渡します。 最初にこのオブジェクトを構築する必要がありますが、Create
を呼び出さないでください。 このソケット オブジェクトがスコープ外になると、接続が閉じられることに注意してください。 MFC は、新しいオブジェクトを SOCKET ハンドルに接続します。 次に示すように、スタック上またはヒープ上にソケットを構築できます。アーカイブとソケット ファイルは、スコープ外になると閉じられます。 ソケット オブジェクトのデストラクターは、オブジェクトがスコープ外になったり削除されたりしたときに、ソケット オブジェクトの Close メンバー関数も呼び出します。
シーケンスに関するその他の注意事項
前の表に示した一連の呼び出しは、ストリーム ソケット用です。 接続なしのデータグラム ソケットでは、 CAsyncSocket::Connect、 Listen、 Accept の呼び出しは必要ありません (ただし、必要に応じて Connect
を使用できます)。 代わりに、クラス CAsyncSocket
を使用している場合、データグラム ソケットは CAsyncSocket::SendTo
と ReceiveFrom
メンバー関数を使用します。 (データグラム ソケットで Connect
を使用する場合は、 Send
と Receive
を使用します)。 CArchive
はデータグラムでは機能しないため、ソケットがデータグラムの場合はアーカイブで CSocket
を使用しないでください。
CSocketFile は、CFile
のすべての機能をサポートしているわけではありません。ソケット通信に意味のないSeek
などのCFile
メンバーは使用できません。 このため、一部の既定の MFC Serialize
関数は CSocketFile
と互換性がありません。 これは、 CEditView
クラスに特に当てはまります。
CEditView::SerializeRaw
を使用して、CSocketFile
オブジェクトにアタッチされたCArchive
オブジェクトを介してCEditView
データをシリアル化しないでください。代わりにCEditView::Serialize
を使用してください (文書化されていません)。
SerializeRaw 関数は、CSocketFile
がサポートしていないSeek
などの関数をファイル オブジェクトに含める必要があります。
詳細については、以下を参照してください。
こちらも参照ください
MFC の Windows ソケット
CSocket クラス
CAsyncSocket::Create
CAsyncSocket::Close