次の方法で共有


Windows ソケット: 一連の操作

この記事では、サーバー ソケットとクライアント ソケットに対する一連の操作を並べて示します。 ソケットは 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" という形式を使用できます。 IP アドレスでは、"ドット番号" 形式 "127.54.67.32" が使用されます。 Connect関数は、アドレスが点線の数値であるかどうかを確認します (ただし、ネットワーク上の有効なマシンであることを確認しません)。 そうでない場合、 Connect は他のいずれかの形式のマシン名を想定します。

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

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

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

前の表に示した一連の呼び出しは、ストリーム ソケット用です。 接続なしのデータグラム ソケットでは、 CAsyncSocket::ConnectListenAccept の呼び出しは必要ありません (ただし、必要に応じて Connectを使用できます)。 代わりに、クラス CAsyncSocketを使用している場合、データグラム ソケットは CAsyncSocket::SendToReceiveFrom メンバー関数を使用します。 (データグラム ソケットで Connect を使用する場合は、 SendReceiveを使用します)。 CArchive はデータグラムでは機能しないため、ソケットがデータグラムの場合はアーカイブで CSocket を使用しないでください。

CSocketFile は、CFileのすべての機能をサポートしているわけではありません。ソケット通信に意味のないSeekなどのCFileメンバーは使用できません。 このため、一部の既定の MFC Serialize 関数は CSocketFileと互換性がありません。 これは、 CEditView クラスに特に当てはまります。 CEditView::SerializeRawを使用して、CSocketFile オブジェクトにアタッチされたCArchive オブジェクトを介してCEditViewデータをシリアル化しないでください。代わりにCEditView::Serializeを使用してください (文書化されていません)。 SerializeRaw 関数は、CSocketFileがサポートしていないSeekなどの関数をファイル オブジェクトに含める必要があります。

詳細については、以下を参照してください。

こちらも参照ください

MFC の Windows ソケット
CSocket クラス
CAsyncSocket::Create
CAsyncSocket::Close