CSocketFile クラス
Windows ソケットを使ったネットワーク間でのデータの送受信に使われる CFile オブジェクトです。
class CSocketFile : public CFile
メンバー
パブリック コンストラクター
名前 |
説明 |
---|---|
CSocketFile オブジェクトを構築します。 |
解説
CSocket のオブジェクトへの CSocketFile のオブジェクトをこの目的にアタッチできます。また、通常、MFC のシリアル化を使用してデータの送信と受信を簡単にするために CArchive のオブジェクトへの CSocketFile のオブジェクトをアタッチする。
(送信) データをシリアル化するには、CSocket のオブジェクトにデータを書き込むために CSocketFile のメンバー関数を呼び出すアーカイブにタスクを挿入します。(受け取る) データを逆シリアル化するには、アーカイブから抽出します。これにより、アーカイブは CSocket のオブジェクトからデータを読み取るに CSocketFile のメンバー関数を呼び出します。
ヒント |
---|
ここで説明したように CSocketFile を使用する以外に、CFileと同様に、スタンドアロン ファイルとしてオブジェクト、基本クラスも使用できます。また、アーカイブ ベースの MFC のシリアル化の関数の CSocketFile を使用できます。CSocketFile が CFile のすべての機能をサポートしていないため、既定の MFC は関数ではありません。CSocketFileと互換性のあるシリアル化します。これは CEditView のクラスに当てはまります。アタッチされた CSocketFile のオブジェクトへの CArchive オブジェクトを通じて CEditView のデータを CEditView::SerializeRawを使用してシリアル化しようとしないでください; CEditView::Serialize を使用します。SerializeRaw 関数は、関数が、CSocketFile にない Seekなど、一部のファイルとオブジェクトが必要です。 |
CSocketFile と CSocketの CArchive を使用すると、CSocket::Receive がバイトの要求した量を待機するループ (など) を入力 **PumpMessages(FD_READ)**状態に陥る可能性があります。これは、Windows ソケットで FD_READ 通知ごとに 1 回だけを割り当てる recv の呼び出しが、CSocketFile と CSocket は 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を参照してください。
継承階層
CSocketFile
必要条件
Header: afxsock.h