Windows ソケット : 動作シーケンス
この記事では、サーバー ソケットとクライアント ソケットの動作のシーケンスを並行して説明します。 ソケットは CArchive
オブジェクトを使用するため、必然的にストリーム ソケットになります。
ストリーム ソケット通信の動作のシーケンス
CSocketFile
オブジェクトを構築するところまでは、次のシーケンスが CAsyncSocket
と CSocket
のどちらについても正確です (パラメーターの違いは、いくつかあります)。 それ以降のシーケンスは、厳密に CSocket
に対するものです。 次の表は、クライアントとサーバー間の通信をセットアップするための動作シーケンスを示しています。
サーバーとクライアント間の通信のセットアップ
サーバー | Client |
---|---|
// 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
のすべての機能がサポートされているわけではありません。CFile
のメンバーの Seek
などは、ソケット通信では意味がなく、使用できません。 このため、一部の既定の MFC Serialize
関数は、CSocketFile
と互換性がありません。 これは、CEditView
クラスに特に当てはまります。 CSocketFile
オブジェクトにアタッチされている CArchive
オブジェクトを通じて CEditView
データをシリアル化しようとするときに、CEditView::SerializeRaw
は使用しないでください。代わりに、CEditView::Serialize
(ドキュメント化されていません) を使用してください。 SerializeRaw 関数は、ファイル オブジェクトに Seek
などの関数があることを想定しています。それらは、CSocketFile
ではサポートされていません。
詳細については、以下を参照してください:
関連項目
MFC における Windows ソケット
CSocket クラス
CAsyncSocket::Create
CAsyncSocket::Close