Bug #2632
closedWindows での未読のあるソケットのクローズ後の読み取り
Description
=begin
Windows XP SP3 で、添付の test.rb を実行すると、Errno::ECONNRESET 例外が発生します。
$ ruby test.rb
test.rb:11:in gets': 既存の接続はリモート ホストに強制的に切断されました。 (Errno::ECONNRESET) from test.rb:11:in
'
C で同様のプログラムを書いた場合も同じ減少が確認できたので、Winsock2 の仕様と思われます。
しかし不便なのでできれば ruby 側で回避できる部分はしてしまうのはどうでしょうか。
具体的に困る例として drb で argc_limit を超えた長さの引数を渡したとき
DRbMessage#recv_request 中で引数を読まずに通信を終了するので
これにより DRbConnError を起こしてしまう、というものがあります。
TestDRbCore#test_03 などで確認できます。
ソケットを shutdown / close するときに読み込めるデータがあればすべて破棄するようにした
パッチを書いてみたので添付します。
また、vista や 7 で動作が異なっている場合は教えていただけるとありがたいです。
=end
Files
Updated by wanabe (_ wanabe) almost 15 years ago
- File test.rb test.rb added
- File winsock2.patch winsock2.patch added
=begin
=end
Updated by usa (Usaku NAKAMURA) almost 15 years ago
=begin
こんにちは、なかむら(う)です。
In message "[ruby-dev:40135] [Bug #2632] Windows での未読のあるソケットのクローズ後の読み取り"
on Jan.23,2010 03:22:42, redmine@ruby-lang.org wrote:
また、vista や 7 で動作が異なっている場合は教えていただけるとありがたいです。
Windows7で試したところ、test.rbは例外なく(おそらくは)期待通り
に終了します。
それでは。¶
U.Nakamura usa@garbagecollect.jp
=end
Updated by usa (Usaku NAKAMURA) almost 15 years ago
- Status changed from Open to Assigned
=begin
=end
Updated by usa (Usaku NAKAMURA) over 14 years ago
- Assignee changed from usa (Usaku NAKAMURA) to wanabe (_ wanabe)
=begin
このパッチについては特に反対しないので、望むなら入れてもらってかまいません。
=end
Updated by wanabe (_ wanabe) over 14 years ago
- Status changed from Assigned to Rejected
=begin
改めて考えますと、最新の Windows7 で問題ないのであれば
わざわざ動的コストをかけて対策するまでもないかもしれません。
どうしても必要であれば、スクリプト側でソケットを閉じる前に処理すればいいだけですし。
この問題が実用的に障害となるようなケースが見つかれば別ですが
とりあえず Reject させていただきます。失礼しました。
=end