市田です。

On 2016/11/04 23:52, U.NAKAMURA wrote:

> 実装仕様というか、OS側のgetaddrinfoの挙動に依存しますので、まあ
> そういうことです。
> (と、TCPServer.newのドキュメントに書いてあると思います。)

和文マニュアルにはないですが、rdoc
https://docs.ruby-lang.org/en/2.3.0/TCPServer.html#method-c-new
には
If getaddrinfo() returns multiple addresses, ::new tries to create
a server socket for each address and returns first one that is successful.
とありました。

> 個人的には、このようなことに頭を悩ませても仕方ないと思うので、
> Socket.tcp_server_socketsとかSocket.tcp_server_loopとかいった
> 素敵なメソッドを使うのがよろしいのではないかと思います。

これは同意です。

ただ元々、UnixとWindowsとで仕様が異なる

 > UNIX プラットフォームでは、IPv4 と IPv6 の両方の受信接続を同一の
 > ソケットで受信します。Microsoft Windows は、IPv4 と IPv6 の両方の
 > 受信接続を同一のソケットで受信できません。

https://www.ibm.com/support/knowledgecenter/ja/SSKTMJ_9.0.1/admin/plan_receivingincomingconnectionsonipv6oripv4sockets_c.html

とは言え
https://github.com/dogatana/ruby/blob/trunk/ext/socket/ipsocket.c#L65
が(何となく)IPv4 を返す工夫に見えます。

INET6 の定義の意味を知らずに言うのもおかしいのですが、
!defined(INET6) の ! がなければUnixとWindowsとで同じ挙動になって
それはそれで嬉しい気がします。