[ruby-list:50451] Re: WindowsでTCPServerをホスト指定しないで動かすと他ホストから接続できない
From:
Toshihiko Ichida <dogatana@...>
Date:
2016-11-06 13:30:54 UTC
List:
ruby-list #50451
市田です。 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とで同じ挙動になって それはそれで嬉しい気がします。