Bug #8605
closedBug #8574: CI Build failure introduced by r41686
TestSocket_TCPSocket#test_initialize_failure fails on Windows
Description
=begin
表題の通りですが、こんな風に失敗しています。
- Failure:
TestSocket_TCPSocket#test_initialize_failure [D:/tmp/mswin-build20130705-8260-1av0ek2/ruby/test/socket/test_tcp.rb:24]:
Expected /for\ "127.0.0.1"\ port\ 11459/ to match "Only one usage of each socket address (protocol/network address/port) is normally permitted. - connect(2) for "127.0.0.1" port 11458".
テストを眺めると、クライアントポート側で失敗するはずだ、と明記されているわけですが、なぜかご覧の通りでサーバポート側でエラーメッセージが出力されております。
これはrubyでどうにかすべき問題でしょうか? それとも単にプラットフォーム依存として片付けるべき?
=end
Updated by akr (Akira Tanaka) over 11 years ago
- Parent task set to #8574
Bug #8574 にもあって、なにが起きてるのかなぁ、と思っていたのですが、
調べてみると、_WIN32 と CYGWIN では SO_REUSEADDR を使っていないようです。
ext/socket/ipsocket.c:
9627 usa #if !defined(_WIN32) && !defined(CYGWIN)
9627 usa status = 1;
9627 usa setsockopt(fd, SOL_SOCKET, SO_REUSEADDR,
27529 nobu (char*)&status, (socklen_t)sizeof(status));
9627 usa #endif
r9627 からは [ruby-core:6765] をたどれて、Win32 では SO_REUSEADDR が
うまく動かないとのことですが、これはいまでもそうなんでしょうか。
Updated by usa (Usaku NAKAMURA) over 11 years ago
- Status changed from Assigned to Rejected
あー、そうかー、言われてみたらそんな話あったわー、という感じです。
わざわざ調べていただきありがとうございます。
(ちなみにさらに遡ったら r1800 からのようですね。)
事情は [ruby-core:6765] で説明されている通りですが、これは現在も
変わってないので、おとなしく諦めますかね。
テストの方は #8574 への対応ということで成瀬さんが既に変更済みですし。
Updated by akr (Akira Tanaka) over 11 years ago
2013年7月8日 11:21 usa (Usaku NAKAMURA) usa@garbagecollect.jp:
あー、そうかー、言われてみたらそんな話あったわー、という感じです。
わざわざ調べていただきありがとうございます。
(ちなみにさらに遡ったら r1800 からのようですね。)事情は [ruby-core:6765] で説明されている通りですが、これは現在も
変わってないので、おとなしく諦めますかね。
テストの方は #8574 への対応ということで成瀬さんが既に変更済みですし。
エラーメッセージのテストなので、
bind が失敗するならなんでもいいとは思うのですが。
EADDRINUSE 以外だと、
Unix なら port 1023 以下で EACCES とかもありますが、
それはおそらく Windows だと動いちゃいますよねぇ。
127.0.0.1 と ::1 との組み合わせで EAFNOSUPPORT というのは
現在なら大抵の環境で動く気もしますが、どうなんだろうなぁ。
あぁ、自分の IP アドレスではない IP アドレスを指定して
EADDRNOTAVAIL という手もあるか。
そういうアドレスをどうやって選ぶか、という話はありますが。
Tanaka Akira