[ruby-list:50446] WindowsでTCPServerをホスト指定しないで動かすと他ホストから接続できない
From:
Shin Kuboaki <kuboaki@...>
Date:
2016-11-02 08:12:09 UTC
List:
ruby-list #50446
久保秋と申します。 1)表題の動作は、みなさんも再現する現象でしょうか。 サーバー: require "socket" server = TCPServer.open( 3000 ) # <1> sock = server.accept p "connected" server.close (以下略) クライアント: require "socket" host = 'localhost' sock = TCPSocket.open( host, 3000 ) (以下略) サーバーのコードを、Windows10上のRuby 2.3.1で動かすと、 localhost上のクライアントからは接続できますが、 他のホスト(Mac、Windows)上で動作するクライアントからは接続できません。 ActiveScriptRubyの1.8.7でこのコードを動かすと、ほかのホストからも接続できます。 この現象は、みなさんにも再現性のある問題でしょうか。 Windows上の2.3.1で発生する原因は何でしょうか。 2)openメソッドの省略時引数を変更しませんか サーバーの<1>の行のopenメソッドを、open( "", 3000 ) のように INADDR_ANYの指定形式にして書くと、ほかのホストからも接続できます。 TCPServerのドキュメントには、次のように書いてあります。 open(host=nil, service) -> TCPServer 「host を指定した時は 指定したホストに対しての接続だけを受け付けます。 省略時は全てのホスト(インタフェース)への接続要求を受け付けることになります。 host に指定できる形式はsocket/ホスト指定形式を見てください。」 私には、ホスト指定を省略した時は、ホスト指定はnilとみなし、 動作はホスト指定形式「""」と同等に扱う、と読めます。 ホスト指定の省略時引数を、ホスト指定形式に含まれていない「nil」ではなく、 ドキュメントの説明に合う「"" または "<any>"」にしてはいかがでしょうか。 -- kuboaki