Windows ソケット : 動作シーケンス

この記事では、サーバー ソケットとクライアント ソケットの動作のシーケンスを並行して説明します。 ソケットは CArchive オブジェクトを使用するため、必然的にストリーム ソケットになります。

ストリーム ソケット通信の動作のシーケンス

CSocketFile オブジェクトを構築するところまでは、次のシーケンスが CAsyncSocketCSocket のどちらについても正確です (パラメーターの違いは、いくつかあります)。 それ以降のシーケンスは、厳密に 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
  1. ここで、nPort はポート番号です。 ポートの詳細については、「Windows ソケット: ポートとソケット アドレス」を参照してください。

  2. クライアントが接続できるように、サーバーは常にポートを指定する必要があります。 Create 呼び出しでも、アドレスを指定することがあります。 クライアント側では、既定のパラメーターを使用します。これにより、使用可能な任意のポートを使用するように MFC に要求します。

  3. ここで、nPort はポート番号であり、strAddr はマシン アドレスまたはインターネット プロトコル (IP) アドレスです。

  4. マシン アドレスには、"ftp.microsoft.com"、"microsoft.com" など、いくつかの形式があります。 IP アドレスは、"127.54.67.32" など、"ドット区切りの数字" の形式を使用します。 Connect 関数は、アドレスがドット区切りの数字かどうかを確認します (ただし、この数字がネットワーク上の有効なマシンであるかどうかは確認しません)。 そうでない場合、Connect は他のいずれかの形式のマシン名を想定します。

  5. サーバー側で Accept を呼び出すときに、新しいソケット オブジェクトへの参照を渡します。 このオブジェクトは最初に構築する必要がありますが、そのために Create を呼び出さないでください。 このソケット オブジェクトがスコープ外になると、接続が閉じられることに注意してください。 MFC によって、新しいオブジェクトが SOCKET ハンドルに接続されます。 ソケットの構築は、示されているようにスタック上で行うことも、ヒープ上で行うこともできます。

  6. アーカイブとソケット ファイルは、スコープ外に出ると閉じられます。 ソケット オブジェクトのデストラクターも、オブジェクトがスコープ外に出るか削除されるときに、ソケット オブジェクトの Close メンバー関数を呼び出します。

シーケンスに関するその他の注意事項

前の表に示されている呼び出しのシーケンスは、ストリーム ソケット用です。 コネクションレス型のデータグラム ソケットは、CAsyncSocket::ConnectListen、および Accept 呼び出しを必要としません (ただし、オプションで Connect を使用することもできます)。 代わりに、クラス CAsyncSocket を使用している場合、データグラム ソケットは、CAsyncSocket::SendTo メンバー関数と ReceiveFrom メンバー関数を使用します (データグラム ソケットで使用 Connect する場合は、次を使用 Send します ReceiveCArchive データグラムでは機能しないため、ソケットがデータグラムの場合はアーカイブで使用 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