CSocket クラス
CAsyncSocketから派生し、WindowsソケットAPIのカプセル化を継承し、CAsyncSocket のオブジェクトよりも高いレベルの抽象化を表します。
class CSocket : public CAsyncSocket
メンバー
パブリック コンストラクター
名前 |
説明 |
---|---|
CSocket オブジェクトを構築します。 |
パブリック メソッド
名前 |
説明 |
---|---|
CSocket のオブジェクトに [ソケット] ハンドルをアタッチします。 |
|
現在進行中のブロッキング呼び出しを取り消します。 |
|
ソケットを作成します。 |
|
[ソケット] のハンドルがの CSocket オブジェクトへのポインターを返します。 |
|
ブロッキング呼び出しが実行中であるかどうかを判定します。 |
プロテクト メソッド
名前 |
説明 |
---|---|
完了するためにブロッキング呼び出しを待機している間、メッセージの処理するために呼び出されます。 |
解説
CSocket は、クラス CSocketFile と CArchive をデータの送信と受信を管理するために使用します。
CSocket のオブジェクトも CArchiveの同期操作に必要なブロッキングを提供します。ブロックは、Receiveなど、Send、ReceiveFrom、SendTo機能し、Accept (完全に CAsyncSocketから継承されます)、CSocketの WSAEWOULDBLOCK のエラーが返されます。代わりに、これらの関数は、操作が完了するまで待機します。また、元のの呼び出しはエラーと WSAEINTR これらの関数の1種類がブロックされて CancelBlockingCall が呼び出されたときに終了します。
CSocket のオブジェクトを使用するには、SOCKET の基になる型 (SOCKET) ハンドルを作成するように、コンストラクター、呼び出し Create を呼び出します。Create の既定のパラメーターは、ストリーム ソケットを作成します CArchive のオブジェクトを使用して、ソケットを使用する代わりに、データグラム ソケットを作成するには、パラメーターを指定したり、サーバーのソケットを作成する特定のポートにバインドします。クライアント側の Connect とサーバー側の Accept を使用してクライアントのソケットに接続します。次 CSocketFile のオブジェクトを作成し、CSocketFile のコンストラクターの CSocket のオブジェクトに関連付けます。次に (必要な場合)、送信するための CArchive のオブジェクトとデータを受け取るため、" 1 "を作成し、CArchive のコンストラクターの CSocketFile のオブジェクトに関連付けます。通信が完了すると、CArchive、CSocketFileと CSocket オブジェクトを破棄します。SOCKET のデータ型 Windowsソケット: 背景は、" "で説明します。
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 が受け取るとuserが受け取るおおよそのバイト数です。コード内で、他の場所で宣言することを前提としています。
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ソケット: アーカイブを使用してソケットの例を参照してください。
継承階層
CSocket
必要条件
ヘッダー: afxsock.h