私はいくつかのWIN32ソケットプログラミングを行っていますが、なぜオーバーラップIOが望ましいのか理解しようとしています。 IOイベントがなかった場合は特に、私はこのなぜ非同期IOが好ましいですか
if (WSARecv(
socket,
dataBuf,
1,
NULL,
&flags,
&ov,
NULL)
== SOCKET_ERROR) {
if (WSAGetLastError() == WSA_IO_PENDING)
{
if (WSAWaitForMultipleEvents(1, &ov.hEvent, FALSE, INFINITE, FALSE) == WAIT_TIMEOUT)
{
return FALSE;
}
} else {
return FALSE;
}
}
// ... more code here
return TRUE;
のようなものが私の理解から、この
recv(socket, dataBuf, bufLen), 0);
のような通常のIO呼び出しよりも好まれている理由思ったんだけど、最初の呼び出しはブロックされますWSAWaitForMultipleEventsで完了し、2番目の呼び出しはデータが到着するまでrecvで直接ブロックされます。 IOコールのブロックが少し遅れてしまうのは実際のメリットですか?それはIFあなたはあなたがそれをやるのを待つ前にできることがありましたか?
データが到着するまで何もすることができないアプリケーションでは、価値のある重複IOが必要ですか?
データを待っている間にできることの例を挙げてください。 – FrozenHawk
標準的な例は、複数のアクティブソケット(例えば、サーバ)を有するアプリケーションである。シンプルですがスケーラビリティの低いクライアントごとに1つのスレッドを持つことも、非同期I/Oを使用することもできます。 –
私は正規のアプリケーションがGUIアプリケーションであると思っていたでしょう。ユーザー入力とシステム再描画の呼び出しに応答し続ける必要があるため、応答がなくなります。 –