1

select と FD_SET を使用していくつかのソケットで読み取りを待機しているリッスン スレッドがあります。話は。ある時点で、別のソケットをプールに追加し、select を中止して、select の FD_SET 配列を再初期化する必要があります。プールの変更を通知するイベントがあります。しかし、select はどのようにイベントに反応するのでしょうか? この時点でselect()は20秒の待機間隔でtimevalを使用し、時間をより低い値に変更したくありません。タイムアウトでselect()を頻繁に再起動したくない...

選択を中止する方法はありますか? 選択を通知/再起動し、ソケットの新しいリストを強制的に使用するための正しいアプローチは何ですか(少なくとも1つのソケットがプールに追加されます)

もう 1 つの質問 - Msdn は、「select 関数は 1 つまたは複数のソケットの状態を判断し、必要に応じて待機して同期 I/O を実行します」と述べています。select は、非同期操作を使用するようになったソケットで動作するように設計されていないということですか?

4

2 に答える 2

5

の代わりにWSAEventSelect()とを使用します。そうすれば、プールは で別のイベントを作成し、必要に応じて起動するように通知することができます。WSAWaitForMultipleEvents()select()WSACreateEvent()WSASetEvent()WSAWaitForMultipleEvents()

于 2012-04-27T20:40:14.853 に答える
0

select() をウェイクアップさせたい場合、最も簡単な方法は、select() が読み取りアクセスを待機しているソケットの 1 つにバイトを送信することです。既存のソケットの機能に影響を与えずにそれを実装する 1 つの方法は、その目的専用のソケットのペアを作成し、相互に connect() することです。

于 2012-04-27T18:10:09.393 に答える