トップ回答者
System::Net::Sockets::Select()で、第4引数に"-1"をセットしても無限待ちにならない

質問
-
Visual Studio 2008で、VC++を用いて.NET Frameworkのプログラムを書いています。
System::Net::Sockets::Select()を使用し、Selectで無限待ちさせることを意図して、以下のようにコードを書きました。
----
Socket^ sock; (実体は設定済)
System::Collections::ArrayList^ listenList;
listenList = gcnew System::Collections::ArrayList();
Socket^ tmpSock = nullptr;
listenList->Add(tmpSock);
listenList[0] = sock;
sock->Select(listenList, nullptr, nullptr, -1);
----
MSDNのSocket.Selectメソッドの説明を見ると、第4引数の説明として、「タイムアウト値(マイクロ秒単位)。-1の値はタイムアウトが無期限であることを示します。」との記述があります。 ところが、これを信じて上記のコードを動かすと、Selectがなぜか待ち時間0秒で抜けてしまいます。
なお、第4引数に正の値をセットすると期待通りにマイクロ秒単位の指定時間待ってからSelectを抜けますし、-2以下の負の値をセットするとSelectで無限待ちをするようです。
第4引数に-1をセットしたとき待ち時間0秒で抜けてしまうのは、上記の箇所以外のところなどで何か使い方に誤りがある、ということなのでしょうか。 もしくは、単純にMSDNの説明が違っている、としてよいのでしょうか。
とりあえず、期待したSelectでの無限待ちは実現できたのですが、説明と挙動が違っているので非常に心配です。
以上、よろしくお願いいたします。
回答
-
修正済みの既知バグのようです。.NET 3.5 SP1(.NET 2.0 SP2)まではこの問題が残っていますが、.NET 4か4.5かでは修正されています。
# Socket::Select()の.NET 3.5 英語版のドキュメントにコメントされていました。
- 回答としてマーク kubota.kazuo 2013年9月4日 11:08
-
なお、Socket.Pollであれば-1で無限待機してくれるようです。1つのソケットのRead(/Write/Errorのいずれか一つ)のみを待機するのであれば、こちらで代用することもできるでしょう。
- 回答としてマーク kubota.kazuo 2013年9月4日 11:08
すべての返信
-
修正済みの既知バグのようです。.NET 3.5 SP1(.NET 2.0 SP2)まではこの問題が残っていますが、.NET 4か4.5かでは修正されています。
# Socket::Select()の.NET 3.5 英語版のドキュメントにコメントされていました。
- 回答としてマーク kubota.kazuo 2013年9月4日 11:08
-
なお、Socket.Pollであれば-1で無限待機してくれるようです。1つのソケットのRead(/Write/Errorのいずれか一つ)のみを待機するのであれば、こちらで代用することもできるでしょう。
- 回答としてマーク kubota.kazuo 2013年9月4日 11:08