CSocketFile クラス

Windows ソケットを使ったネットワーク間でのデータの送受信に使われる CFile オブジェクトです。

構文

class CSocketFile : public CFile

メンバー

パブリック コンストラクター

名前 説明
CSocketFile::CSocketFile CSocketFile オブジェクトを構築します。

解説

この目的でオブジェクトを CSocketFile オブジェクトに CSocket アタッチできます。 また、MFC シリアル化を使用してデータの送受信を CSocketFile 簡略化するために、オブジェクト CArchive をオブジェクトにアタッチすることもできます。通常は、これを行います。

データをシリアル化 (送信) するには、それをアーカイブに挿入します。このアーカイブでは、メンバー関数を呼び出 CSocketFile してオブジェクトにデータを CSocket 書き込みます。 データを逆シリアル化 (受信) するには、アーカイブから抽出します。 これにより、アーカイブはメンバー関数を呼び出 CSocketFile してオブジェクトからデータを CSocket 読み取ります。

ヒント

ここで説明したように使用 CSocketFile するだけでなく、基底クラスと同様 CFileに、スタンドアロン のファイル オブジェクトとして使用することもできます。 アーカイブ ベースの MFC シリアル化関数でも使用 CSocketFile できます。 すべての機能をサポートしていないの CSocketFile で、一部の CFile既定の MFC シリアル化関数と互換性がありません CSocketFile。 これは、CEditView クラスに特に当てはまります。 代わりに; を使用CEditView::SerializeRawCEditView::Serializeして、CArchiveオブジェクトにアタッチされたオブジェクトを介してデータをCSocketFileシリアル化CEditViewしないでください。 この関数では SerializeRaw 、ファイル オブジェクトに含まれていない関数 (例: Seek) が含まれている必要 CSocketFile があります。

と共にCSocketFileCSocket使用CArchiveすると、要求されたバイト数を待機するループ (byPumpMessages(FD_READ)) に入る状況CSocket::Receiveが発生する可能性があります。 これは、Windows ソケットでは、FD_READ通知ごとに 1 つの recv 呼び出ししか許可されませんが CSocketFile 、FD_READごとに複数の recv 呼び出し CSocket が許可されるためです。 読み取るデータがないときにFD_READが発生すると、アプリケーションがハングします。 別のFD_READが取得されない場合、アプリケーションはソケット経由で通信を停止します。

この問題は、次のように解決できます。 OnReceiveソケット クラスのメソッドで、ソケットから読み取られる予想されるデータが 1 つの TCP パケットのサイズ (ネットワーク メディアの最大送信単位、通常は少なくとも 1096 バイト) を超えたときに、メッセージ クラスのメソッドを呼び出す前に呼び出CAsyncSocket::IOCtl(FIONREAD, ...)Serializeします。 使用可能なデータのサイズが必要未満の場合は、すべてのデータが受信されるのを待ってから、読み取り操作を開始します。

次の例では、 m_dwExpected ユーザーが受信する予定のおおよそのバイト数です。 コード内の他の場所で宣言することを前提としています。

void CChatSocket::OnReceive(int nErrorCode)
{
   CSocket::OnReceive(nErrorCode);

   DWORD dwReceived;

   if (IOCtl(FIONREAD, &dwReceived))
   {
      if (dwReceived >= m_dwExpected) // Process only if you have enough data
         m_pDoc->ProcessPendingRead();
   }
   else
   {
      // Error handling here
   }
}

詳細については、「 MFC の Windows ソケット」、 Windows ソケット: アーカイブでのソケットの使用、 および Windows Sockets 2 API に関する記事を参照してください。

継承階層

CObject

Cfile

CSocketFile

必要条件

ヘッダー: afxsock.h

CSocketFile::CSocketFile

CSocketFile オブジェクトを構築します。

explicit CSocketFile(
    CSocket* pSocket,
    BOOL bArchiveCompatible = TRUE);

パラメーター

pSocket
オブジェクトにアタッチする CSocketFile ソケット。

bArchiveCompatible
ファイル オブジェクトをオブジェクトで CArchive 使用するかどうかを指定します。 FAL を渡すStandard Editionスタンドアロン オブジェクトと同様にスタンドアロンの方法でオブジェクトをCFile使用CSocketFileする場合にのみ、特定の制限があります。 このフラグは、オブジェクトに CArchive アタッチされているオブジェクトが読み取り用の CSocketFile バッファーを管理する方法を変更します。

解説

オブジェクトのデストラクターは、オブジェクトがスコープ外になったり削除されたりすると、ソケット オブジェクトとの関連付けを解除します。

Note

CSocketFile は、CArchive オブジェクトを含まない (制限付き) ファイルとして使用することもできます。 既定では、 CSocketFile コンストラクターの bArchiveCompatible パラメーターは TRUE です。 これは、ファイル オブジェクトがアーカイブで使用するためのものであることを示します。 アーカイブなしでファイル オブジェクトを使用するには、bArchiveCompatible パラメーターに FAL Standard Edition を渡します。

"アーカイブ互換" モードでは、オブジェクトのパフォーマンスが CSocketFile 向上し、"デッドロック" の危険性が軽減されます。デッドロックは、送信側と受信側の両方のソケットが互いに待機しているとき、または共通リソースを待機しているときに発生します。 この状況は、CArchive オブジェクトが CFile オブジェクトと連動するように CSocketFile と連動した場合に発生する可能性があります。 CFile を使用した場合は、アーカイブで、要求したバイト数より少ないバイト数を受信したときに、ファイルの終わりに達したと見なすことができます。

ただし、CSocketFile を使用した場合は、データがメッセージ ベースになり、バッファーに複数のメッセージが含まれている可能性があるため、要求したバイト数より少ないバイト数を受信しても、ファイルの終わりと見なすことができません。 この場合は、CFile を使用した場合と同様にアプリケーションがブロックしません。バッファーが空になるまで、バッファーからのメッセージの読み取りを継続できます。 CArchive::IsBufferEmpty 関数は、このような場合にアーカイブのバッファーの状態を監視するのに役立ちます。

使用の詳細については、「Windows ソケット: アーカイブでのソケットのCSocketFile使用」および「Windows ソケット: アーカイブを使用するソケットの例」の記事を参照してください。

関連項目

CFile クラス
階層図
CAsyncSocket クラス
CSocket クラス