Bug #8605

Bug #8574: CI Build failure introduced by r41686

TestSocket_TCPSocket#test_initialize_failure fails on Windows

Added by Usaku NAKAMURA 10 months ago. Updated 9 months ago.

[ruby-dev:47484]
Status:Rejected
Priority:Normal
Assignee:Akira Tanaka
Category:ext
Target version:2.1.0
ruby -v:ruby 2.1.0dev (2013-07-05 trunk 41797) [x64-mswin64_100] Backport:1.9.3: UNKNOWN, 2.0.0: UNKNOWN

Description

=begin
表題の通りですが、こんな風に失敗しています。

76) Failure:
TestSocketTCPSocket#testinitializefailure [D:/tmp/mswin-build20130705-8260-1av0ek2/ruby/test/socket/testtcp.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

History

#1 Updated by Akira Tanaka 9 months 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, SOREUSEADDR,
27529 nobu (char*)&status, (socklen
t)sizeof(status));
9627 usa #endif

r9627 からは をたどれて、Win32 では SO_REUSEADDR が
うまく動かないとのことですが、これはいまでもそうなんでしょうか。

#2 Updated by Usaku NAKAMURA 9 months ago

  • Status changed from Assigned to Rejected

あー、そうかー、言われてみたらそんな話あったわー、という感じです。
わざわざ調べていただきありがとうございます。
(ちなみにさらに遡ったら r1800 からのようですね。)

事情は で説明されている通りですが、これは現在も
変わってないので、おとなしく諦めますかね。
テストの方は #8574 への対応ということで成瀬さんが既に変更済みですし。

#3 Updated by Akira Tanaka 9 months ago

2013年7月8日 11:21 usa (Usaku NAKAMURA) usa@garbagecollect.jp:

あー、そうかー、言われてみたらそんな話あったわー、という感じです。
わざわざ調べていただきありがとうございます。
(ちなみにさらに遡ったら r1800 からのようですね。)

事情は で説明されている通りですが、これは現在も
変わってないので、おとなしく諦めますかね。
テストの方は #8574 への対応ということで成瀬さんが既に変更済みですし。

エラーメッセージのテストなので、
bind が失敗するならなんでもいいとは思うのですが。

EADDRINUSE 以外だと、
Unix なら port 1023 以下で EACCES とかもありますが、
それはおそらく Windows だと動いちゃいますよねぇ。

127.0.0.1 と ::1 との組み合わせで EAFNOSUPPORT というのは
現在なら大抵の環境で動く気もしますが、どうなんだろうなぁ。

あぁ、自分の IP アドレスではない IP アドレスを指定して
EADDRNOTAVAIL という手もあるか。
そういうアドレスをどうやって選ぶか、という話はありますが。
--
Tanaka Akira

Also available in: Atom PDF