Windows ソケット : 動作シーケンス
更新 : 2007 年 11 月
ここでは、サーバー ソケットとクライアント ソケットの動作シーケンスを比較しながら説明します。ソケットは 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 |
1. nPort はポート番号です。ポートの詳細については、「Windows ソケット : ポートとソケット アドレス」を参照してください。
2. サーバー側でそのたびにポートを指定しないと、クライアントが接続できません。Create の呼び出しでも、アドレスを指定する場合があります。クライアント側では、MFC が任意の空きポートを使うように既定の引パラメータ数を指定します。
3. nPort はポート番号、strAddr はマシン アドレスまたはインターネット プロトコル (IP) アドレスです。
4. マシン アドレスは、"ftp.microsoft.com" と "microsoft.com" の 2 つの形式があります。IP アドレスには、"ドット区切り番号" 形式 ("127.54.67.32" など) を使います。Connect 関数は、アドレスがドット区切り番号かどうかを調べます (ネットワークで有効なコンピュータ番号かどうかはチェックしません)。ドット区切り番号でない場合は、Connect はほかの形式のコンピュータ名であると見なします。
5. サーバー側で Accept を呼び出すときは、新しいソケット オブジェクトへの参照を渡します。このオブジェクトはあらかじめ生成しておく必要があります。ただし、Create は使わないでください。このソケット オブジェクトがスコープ外に出ると、接続は閉じられます。MFC は新しいオブジェクトを SOCKET ハンドルに接続します。ソケットの生成位置は、スタック上でもヒープ上でもかまいません。
6. アーカイブとソケット ファイルは、スコープを出ると閉じます。ソケット オブジェクトがスコープを出るか、または削除されると、そのオブジェクトのデストラクタが、ソケット オブジェクトの Close メンバ関数も呼び出します。
動作シーケンスに関する追加情報
前の表で示した呼び出しシーケンスは、ストリーム ソケットに対するものです。データグラム ソケットは接続が不要なため、CAsyncSocket::Connect、Listen、Accept の各関数を呼び出す必要はありません。ただし、Connect は必要に応じて使うことができます。CAsyncSocket クラスを使う場合は、データグラム ソケットで CAsyncSocket::SendTo と ReceiveFrom の 2 つのメンバ関数を使います。Connect をデータグラム ソケットで使う場合は、Send と Receive を使います。CArchive はデータグラムとは一緒に使えません。データグラム ソケットの場合は、アーカイブ付きの CSocket を使わないでください。
CSocketFile は、すべての CFile の機能をサポートしません。Seek などの CFile メンバはソケット通信では無意味であり、利用できません。したがって、MFC の既定の Serialize 関数の中には、CSocketFile と一緒に使用できないものがあります。CEditView クラスなどがその例です。特に、CEditView のデータは、CSocketFile オブジェクトに関連付けられている CArchive オブジェクトを使って、CEditView::SerializeRawでシリアル化しないでください。代わりに、CEditView::Serialize (非公開) を使ってください。SerializeRaw 関数は、CSocketFile がサポートしない Seek などの関数がファイル オブジェクトにあるものと想定します。
詳細については、次のトピックを参照してください。