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::SerializeRaw
CEditView::Serialize
して、CArchive
オブジェクトにアタッチされたオブジェクトを介してデータをCSocketFile
シリアル化CEditView
しないでください。 この関数では SerializeRaw
、ファイル オブジェクトに含まれていない関数 (例: Seek
) が含まれている必要 CSocketFile
があります。
と共にCSocketFile
CSocket
使用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 に関する記事を参照してください。
継承階層
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 ソケット: アーカイブを使用するソケットの例」の記事を参照してください。
関連項目
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示