次の方法で共有


Windows ソケット: ブロック

この記事と 2 つのコンパニオン記事では、Windows ソケット プログラミングのいくつかの問題について説明します。 この記事では、ブロックについて説明します。 その他の問題については、「 Windows ソケット: バイト順序付け 」と 「Windows ソケット: 文字列の変換」を参照してください。

クラス CAsyncSocket を使用または派生する場合は、これらの問題を自分で管理する必要があります。 クラス CSocket を使用または派生する場合は、MFC によって管理されます。

ブロッキング

ソケットは、"ブロッキング モード" または "非ブロッキング モード" にすることができます。ブロッキング (または同期) モードのソケットの関数は、アクションを完了するまで戻りません。 関数が呼び出されたソケットは、呼び出しが戻るまで何も実行できないため、ブロックと呼ばれます。 たとえば、 Receive メンバー関数の呼び出しは、送信アプリケーションが送信されるのを待つ間、完了するまでに任意の時間がかかる場合があります (これは、 CSocketを使用している場合、またはブロックで CAsyncSocket を使用している場合です)。 CAsyncSocket オブジェクトが非ブロッキング モード (非同期動作) の場合、呼び出しはすぐに返され、GetLastError メンバー関数を使用して取得可能な現在のエラー コードは WSAEWOULDBLOCK であり、モードが原因で呼び出しがブロックされた可能性があることを示します。 (CSocketWSAEWOULDBLOCK を返しません。このクラスはブロックを管理します)。)

ソケットの動作は、32 ビットオペレーティング システムと 64 ビット オペレーティング システム (Windows 95 や Windows 98 など) では、16 ビット オペレーティング システム (Windows 3.1 など) とは異なります。 16 ビット オペレーティング システムとは異なり、32 ビットオペレーティング システムと 64 ビット オペレーティング システムではプリエンプティブ マルチタスクが使用され、マルチスレッドが提供されます。 32 ビットオペレーティング システムと 64 ビット オペレーティング システムでは、ソケットを個別のワーカー スレッドに配置できます。 スレッド内のソケットは、アプリケーション内の他のアクティビティを妨げることなく、ブロックにコンピューティング時間を費やすことなくブロックできます。 マルチスレッド プログラミングの詳細については、マルチスレッドに関する記事 参照してください。

マルチスレッド アプリケーションでは、 CSocket のブロック特性を使用して、ユーザー インターフェイスの応答性に影響を与えずにプログラムの設計を簡略化できます。 メイン スレッドでユーザー操作を処理し、代替スレッドで処理 CSocket することで、これらの論理操作を分離できます。 マルチスレッドではないアプリケーションでは、これら 2 つのアクティビティを組み合わせて 1 つのスレッドとして処理する必要があります。通常は、 CAsyncSocket を使用してオンデマンドで通信要求を処理したり、 CSocket::OnMessagePending をオーバーライドして長時間の同期アクティビティ中にユーザー アクションを処理したりできます。

この説明の残りの部分は、16 ビット オペレーティング システムを対象とするプログラマ向けです。

通常、 CAsyncSocketを使用している場合は、ブロック操作を使用しないようにし、代わりに非同期的に操作する必要があります。 非同期操作では、Receiveを呼び出した後に WSAEWOULDBLOCK エラー コードを受け取った時点から、たとえば、OnReceive メンバー関数が呼び出されるまで待機して、再度読み取ることができることを通知します。 非同期呼び出しは、 OnReceive などのソケットの適切なコールバック通知関数を呼び出すことによって行われます。

Windows では、ブロック呼び出しは不適切な方法と見なされます。 既定では、 CAsyncSocket は非同期呼び出しをサポートしており、コールバック通知を使用して自分でブロックを管理する必要があります。 一方、 クラス CSocket は同期です。 Windows メッセージをポンプし、ブロックを管理します。

ブロックの詳細については、Windows ソケットの仕様を参照してください。 "オン" 関数の詳細については、「 Windows ソケット: ソケット通知Windows ソケット: ソケット クラスからの派生」を参照してください。

詳細については、以下を参照してください。

こちらも参照ください

MFC の Windows ソケット
CAsyncSocket::OnSend