2

ソケットでreactorスタイルの操作を提供するスケーラブルなWin32API(selectではなくIOCPなど)はありますか?AFAIK IOCPを使用すると、データの読み取りや書き込み(プロクター)などの完了した操作に関する通知を受け取ることができますが、リアクタースタイルの操作を探しています。ソケットが読み取り可能または書き込み可能(リアクター)になったときに通知を受け取る必要があります。

epoll、kqueue 、/dev/poll?

Win32にそのようなAPIはありますか?もしそうなら、どこでマニュアルを見つけることができますか?

**明確化:** selectIOCPと同じくらいスケーラブルなソケット用のAPIのようなものが必要です。または、reactorのような操作でIOCPを使用する方法を探しています。

さらに明確にする: IOCPを使用すると、特定の操作の完了時に通知を受け取ることができます。例えば:

WSARecv(buffer,...); // start reading
WSAWaitForMultipleEvents(...); // wait when read is done

だから私は操作が行われた後に通知を受け取ります-操作の監督者スタイル。

私が必要としているのはそのようなものです:

WSARecv( NOTHING ); // start waiting for readability (not actual read)
WSAWaitForMultipleEvents(...); // wait until read would not block
// Now WSARecv would not block
WSARecv(buffer,...); // now actual non-blocking read

これどうやってするの?

4

4 に答える 4

1

WSAAsyncSelect APIを見たいとします。Windows メッセージ キューを使用して、読み取り/書き込みなどのためにハンドルが読み取られたことを通知するため、IOCP の同時実行性の利点はありませんが、数に制限なく標準のリアクター パターンを実装できます。ハンドル ( などWSAWaitForMultipleEvents)。

于 2010-03-28T04:59:27.860 に答える
0

混乱していますが、スレッドが複数のイベントソースを待機するのをブロックするReactorパターンではありませんか?これは、Windowsがサポートするselect()になります。Proactorパターンは、呼び出しごとに1つのコールバックがあり、ReadFileEx/WriteFileExを介して実行できます。

于 2010-03-27T19:31:12.903 に答える
0

たとえば、ReadFile(socket_fd, ..) にゼロの nNumberOfBytesToRead を渡そうとしましたか?

「読み取り準備完了」イベントを取得すると役立つ場合があります。

于 2010-06-10T19:06:44.333 に答える
0

ありえない。

リアクター スタイルの操作を行い、IOCP を使用する Boost.Asio ソースを確認しました。すべてのリアクター スタイルの操作でselectは、IOCP の代わりに別のスレッドが使用されます。

于 2010-03-28T08:24:12.760 に答える