CSocket クラス
CAsyncSocket の派生クラスで、Windows ソケット API のカプセル化を継承し、CAsyncSocket オブジェクトよりも高いレベルで Windows ソケット API の抽象化を表現しています。
class CSocket : public CAsyncSocket
解説
CSocket は、CSocketFile と CArchive を組み合わせて動作し、データの送受信を管理します。
CSocket オブジェクトは CArchive の同期操作に欠かせないブロッキングも用意します。 Blocking functions, such as Receive, Send, ReceiveFrom, SendTo, and Accept (all inherited from CAsyncSocket), do not return a WSAEWOULDBLOCK error in CSocket. その代わりにこれらの関数は、操作の完了を待ちます。 さらに、元の呼び出しはエラーで終了しますWSAEINTRとCancelBlockingCallこれらの関数のいずれかのブロックしているときに呼び出されます。
使用する、CSocketオブジェクト、コンス トラクターを呼び出してを呼び出してCreate基を作成するSOCKET処理 (型SOCKET)。 既定のパラメーターのCreate、ストリーム ソケットを作成しますが、ソケットを使用している場合、CArchiveオブジェクト、代わりに、データグラム ソケットを作成または特定のポートにサーバー ソケットを作成してバインドするためのパラメーターを指定することができます。 クライアントのソケットを使用する接続Connect、クライアント側とAccept、サーバー側で。 その後 CSocketFile のコンストラクターで CSocketFile オブジェクトを構築して、CSocket オブジェクトに関連付けます。 次に CArchive のコンストラクターで、データ送信用と (必要な場合は) 受信用の CArchive オブジェクトをそれぞれ構築して、CArchive コンストラクター内の CSocketFile オブジェクトに関連付けます。 通信が完了したら、CArchive オブジェクト、CSocketFile オブジェクトおよび CSocket オブジェクトを破棄します。 SOCKETデータ型、資料に記載されてWindows ソケット:背景。
使用する場合CArchiveとCSocketFileとCSocket、状況が発生する可能性がありますどこCSocket::Receiveループ (によってPumpMessages(FD_READ))、要求されたバイトの量を待っています。 これは、Windows ソケットが 1 回の FD_READ 通知につき 1 つの RECV 呼び出しのみ許可するのに、CSocketFile と CSocket は FD_READ ごとに複数の RECV 呼び出しを許可するために起こる現象です。 読み込むデータがない状態で FD_READ を取得した場合、アプリケーションはハングアップします。 別の FD_READ を取得しない場合、アプリケーションはソケット上での通信を停止します。
この問題は次のように解決できます。 OnReceiveメソッドを呼び出し、ソケット クラスの**CAsyncSocket::IOCtl(FIONREAD, ...)**を呼び出す前に、Serializeからソケットを予想されるデータの 1 つの TCP パケット (ネットワーク媒体は、通常少なくとも 1096 バイトの最大転送ユニット) サイズを超えると、メッセージ クラスのメソッド。 利用可能なデータが必要以下のサイズである場合は、すべてのデータを受け取るまで待機し、その後読み取り操作のみ開始します。
次の例の 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 アプリケーションのセカンダリ スレッドで MFC ソケットを使用する場合を呼び出す必要がありますAfxSocketInitのソケットを使用して、ソケット ライブラリを初期化するために各スレッドで。 既定では、AfxSocketInit、プライマリ スレッドでのみ呼び出されます。
詳細についてを参照してくださいMFC Windows ソケット、 Windows ソケット:アーカイブとソケットを使用して、 Windows ソケット:アーカイブ付きソケットの動作、 Windows ソケット:シーケンス操作の、 Windows ソケット:アーカイブを使用してソケットの例。
必要条件
**ヘッダー:**afxsock.h