次の方法で共有


CSocketFile クラス

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

class CSocketFile : public CFile

メンバー

1e4zc0sx.collapse_all(ja-jp,VS.110).gifパブリック コンストラクター

名前

説明

CSocketFile::CSocketFile

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

解説

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

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

ヒントヒント

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

CSocketFileCSocketCArchive を使用すると、CSocket::Receive がバイトの要求した量を待機するループ (など) を入力 **PumpMessages(FD_READ)**状態に陥る可能性があります。これは、Windows ソケットで FD_READ 通知ごとに 1 回だけを割り当てる recv の呼び出しが、CSocketFileCSocket は FD_READ ごとに複数の recv の呼び出しを可能にするためです。読み込むデータがない場合 FD_READ を取得するアプリケーションがハングアップ。、他の FD_READ を取得、アプリケーションは Sockets への通信を停止します。

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

次の例では、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 ソケット API 2を参照してください。

継承階層

CObject

CFile

CSocketFile

必要条件

Header: afxsock.h

参照

関連項目

CFile クラス

階層図

CAsyncSocket クラス

CSocket クラス