Windows ソケット : 動作シーケンス
この記事では、サーバー ソケットとクライアント ソケットの動作のシーケンスを並行して説明します。 ソケットは CArchive オブジェクトを使用するため、必然的にストリーム ソケットになります。
ストリーム ソケット通信の動作のシーケンス
CSocketFile オブジェクトを構築するところまでは、次のシーケンスが CAsyncSocket と CSocket のどちらについても正確です (パラメーターの違いは、いくつかあります)。 それ以降のシーケンスは、厳密に CSocket に対するものです。 次の表は、クライアントとサーバー間の通信をセットアップするための動作シーケンスを示しています。
サーバーとクライアント間の通信のセットアップ
| サーバー | Client |
|---|---|
// construct a socketCSocket sockSrvr; |
// construct a socketCSocket sockClient; |
// create the SOCKETsockSrvr.Create(nPort);1,2 |
// create the SOCKETsockClient.Create( );2 |
// start listeningsockSrvr.Listen( ); |
|
// seek a connectionsockClient.Connect(strAddr, nPort);3,4 |
|
// construct a new, empty socketCSocket sockRecv;// accept connectionsockSrvr.Accept( sockRecv ); 5 |
|
// construct file objectCSocketFile file(&sockRecv); |
// construct file objectCSocketFile file(&sockClient); |
// construct an archiveCArchive arIn(&file, CArchive::load);または CArchive arOut(&file, CArchive::store);または両方 |
// construct an archiveCArchive 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する場合は、.SendReceive)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