次の方法で共有


CSocket クラス

CAsyncSocketから派生し、WindowsソケットAPIのカプセル化を継承し、CAsyncSocket のオブジェクトよりも高いレベルの抽象化を表します。

class CSocket : public CAsyncSocket

メンバー

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

名前

説明

CSocket::CSocket

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

wxzt95kb.collapse_all(ja-jp,VS.110).gifパブリック メソッド

名前

説明

CSocket::Attach

CSocket のオブジェクトに [ソケット] ハンドルをアタッチします。

CSocket::CancelBlockingCall

現在進行中のブロッキング呼び出しを取り消します。

CSocket::Create

ソケットを作成します。

CSocket::FromHandle

[ソケット] のハンドルがの CSocket オブジェクトへのポインターを返します。

CSocket::IsBlocking

ブロッキング呼び出しが実行中であるかどうかを判定します。

wxzt95kb.collapse_all(ja-jp,VS.110).gifプロテクト メソッド

名前

説明

CSocket::OnMessagePending

完了するためにブロッキング呼び出しを待機している間、メッセージの処理するために呼び出されます。

解説

CSocket は、クラス CSocketFileCArchive をデータの送信と受信を管理するために使用します。

CSocket のオブジェクトも CArchiveの同期操作に必要なブロッキングを提供します。ブロックは、Receiveなど、SendReceiveFromSendTo機能し、Accept (完全に CAsyncSocketから継承されます)、CSocketWSAEWOULDBLOCK のエラーが返されます。代わりに、これらの関数は、操作が完了するまで待機します。また、元のの呼び出しはエラーと WSAEINTR これらの関数の1種類がブロックされて CancelBlockingCall が呼び出されたときに終了します。

CSocket のオブジェクトを使用するには、SOCKET の基になる型 (SOCKET) ハンドルを作成するように、コンストラクター、呼び出し Create を呼び出します。Create の既定のパラメーターは、ストリーム ソケットを作成します CArchive のオブジェクトを使用して、ソケットを使用する代わりに、データグラム ソケットを作成するには、パラメーターを指定したり、サーバーのソケットを作成する特定のポートにバインドします。クライアント側の Connect とサーバー側の Accept を使用してクライアントのソケットに接続します。次 CSocketFile のオブジェクトを作成し、CSocketFile のコンストラクターの CSocket のオブジェクトに関連付けます。次に (必要な場合)、送信するための CArchive のオブジェクトとデータを受け取るため、" 1 "を作成し、CArchive のコンストラクターの CSocketFile のオブジェクトに関連付けます。通信が完了すると、CArchiveCSocketFileCSocket オブジェクトを破棄します。SOCKET のデータ型 Windowsソケット: 背景は、" "で説明します。

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 が受け取ると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ソケット: アーカイブを使用してソケットの例を参照してください。

継承階層

CObject

CAsyncSocket

CSocket

必要条件

ヘッダー: afxsock.h

参照

関連項目

CAsyncSocket クラス

階層図

CAsyncSocket クラス

CSocketFile クラス