久保秋です。

市田さん、なかむらさん、ありがとうございます。

個人的には、このようなことに頭を悩ませても仕方ないと思うので、
>> 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
>
>
まさに、私はこのことがわかっておらず、
TCPServerの動作に一貫性がないと誤解していたようです。


> とは言え
> https://github.com/dogatana/ruby/blob/trunk/ext/socket/ipsocket.c#L65
> が(何となく)IPv4 を返す工夫に見えます。
>
> INET6 の定義の意味を知らずに言うのもおかしいのですが、
> !defined(INET6) の ! がなければUnixとWindowsとで同じ挙動になって
> それはそれで嬉しい気がします。
>

こちらについては、識者の方に議論の余地があるなら、検討いただければと思います。

-- kuboaki