Windows ソケット : ブロッキング
この技術情報、および 2 個の関連レポートは、 Windows ソケット プログラミングのいくつかの問題について説明します。この技術情報はブロックについて説明します。そのほかの問題は技術情報でカバーされています: Windows ソケット: 処理命令 と Windows ソケット: 文字列の変換。
クラス CAsyncSocketを使用または取得する場合は、これらの懸案事項を管理する必要があります。クラス CSocketを使用または取得する場合、 MFC は自動的にこれらを管理します。
ブロック
ソケットでは、 「ブロック モード」または 「ノンブロッキング モードになる場合があります」。ブロック ()または同期モードのソケット関数は、操作を完了できる返されません。これは、関数が呼び出された場合、ソケットで —呼び出しの戻りまでの…何も —ブロックできないため、ブロックと呼ばれます。Receive のメンバー関数への呼び出しは、たとえば、待機して送信送信元アプリケーションを、として完了するために時間をランダムにかかることがあります (これは CSocketを使用する場合は、にブロックを使用して CAsyncSocket を使用します)。CAsyncSocket のオブジェクトがノンブロッキング モード (非同期的に実行する場合、呼び出しはすぐに戻し、 GetLastError のメンバー関数で取得できる現在のエラー コードは、呼び出しがモードですぐに戻さなくてもらったそれをブロックことを示す WSAEWOULDBLOCKです。(CSocket は、 WSAEWOULDBLOCKを返しません。クラスは、のブロックを管理します)。
ソケットの動作は、 16 ビット オペレーティング システムでは 32 ビットおよび 64 ビット オペレーティング システムで異なっています (Windows 95 または Windows 98) (Windows 3.1 など)。16 ビットのオペレーティング システムとは異なり、 32 ビットおよび 64 ビット オペレーティング システムでは、プリエンプティブなマルチタスクを使用して、マルチスレッドを提供します。32 ビットおよび 64 ビット オペレーティング システムでは、別のワーカー スレッドにソケットを配置できます。スレッドのソケットは、アプリケーションの他のアクティビティに干渉しないとブロックに計算時間を使わないでブロックできます。マルチスレッド プログラミングの詳細については、技術情報 マルチスレッドを参照してください。
[!メモ]
マルチスレッド アプリケーションでは、ユーザー インターフェイスの応答性に影響を与えずにプログラム デザインを簡単に CSocket ブロックの性質を使用できます。別のスレッドで処理するメイン スレッドと CSocket のユーザー操作の処理によってこれらの論理的な操作を分離することができます。マルチスレッドではないアプリケーションでは、これらの二つのアクティビティはとして、 CAsyncSocket を使用して、処理が意味する、長い同期アクティビティの間にユーザー アクションを処理する、通信の要求またはオーバーライドの CSocket::OnMessagePending をオンデマンド式で処理できるシングル スレッド必要があります。
この説明は、他のプログラミング用対象とする 16 ビット オペレーティング システムをです:
通常 CAsyncSocketを使用すると、ブロック操作を使用せず、非同期的にアクティブにする必要があります。再び読み取ることができることを通知するために OnReceive のメンバー関数が呼び出されるまで、 Receiveたとえば、を呼び出した後 WSAEWOULDBLOCK のエラー コードを受け取る点から非同期操作で、待機します。非同期呼び出しで OnReceiveのようなソケット適切なコールバックの通知関数を呼び出すことによって行われます。
ウィンドウの下に、ブロッキング呼び出しが意図と見なされます。既定では、 CAsyncSocket は、非同期呼び出しをサポートし、ブロックを自分でコールバックの通知を管理します。クラス CSocketは、同期的です。これは Windows メッセージ ポンプを組み込み、開発者はブロックを管理します。
ブロックの詳細については、 Windows ソケットの仕様を参照してください。" on " の関数についての詳細については、 Windows ソケット: ソケットの通知 と Windows ソケット: ソケット クラスから派生しますを参照してください。
詳細については、次のトピックを参照してください。