次の方法で共有


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

更新 : 2007 年 11 月

ここでは、サーバー ソケットとクライアント ソケットの動作シーケンスを比較しながら説明します。ソケットは CArchive オブジェクトを使うので、ストリーム ソケットになります。

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

CSocketFile オブジェクトの生成までの動作シーケンスは、CAsyncSocketCSocket も、一部のパラメータを除いて次の表のとおりです。これ以降のシーケンスは、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::ConnectListenAccept の各関数を呼び出す必要はありません。ただし、Connect は必要に応じて使うことができます。CAsyncSocket クラスを使う場合は、データグラム ソケットで CAsyncSocket::SendToReceiveFrom の 2 つのメンバ関数を使います。Connect をデータグラム ソケットで使う場合は、SendReceive を使います。CArchive はデータグラムとは一緒に使えません。データグラム ソケットの場合は、アーカイブ付きの CSocket を使わないでください。

CSocketFile は、すべての CFile の機能をサポートしません。Seek などの CFile メンバはソケット通信では無意味であり、利用できません。したがって、MFC の既定の Serialize 関数の中には、CSocketFile と一緒に使用できないものがあります。CEditView クラスなどがその例です。特に、CEditView のデータは、CSocketFile オブジェクトに関連付けられている CArchive オブジェクトを使って、CEditView::SerializeRawでシリアル化しないでください。代わりに、CEditView::Serialize (非公開) を使ってください。SerializeRaw 関数は、CSocketFile がサポートしない Seek などの関数がファイル オブジェクトにあるものと想定します。

詳細については、次のトピックを参照してください。

参照

概念

MFC における Windows ソケット

参照

CSocket クラス

CAsyncSocket::Create

CAsyncSocket::Close