1

私の Rails 3.2 アプリでは、TradingViewから埋め込まれた JavaScript チャートを使用しています。ただし、表示するにはポート 443 を開く必要があるようです。したがって、ポートがユーザーに対して開いているかどうかを確認しようとしています。開いていない場合は、グラフ以外に何かを表示します。

この投稿「Ruby - ポートが開いているかどうかを確認する」を見つけ、この回答に取り組んできました。

require 'socket'
require 'timeout'

def port_open?(ip, port, seconds=1)
  Timeout::timeout(seconds) do
    begin
      TCPSocket.new(ip, port).close
      true
    rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH
      false
    end
  end
rescue Timeout::Error
  false
end

ただし、次のように変更しました。

def port_open?(ip, port=443, seconds=1)

チェックするポートは常に同じであるためです。

私は次のようにメソッドを呼び出しています:

@ip = request.remote_ip
test = port_open?(@ip)

ファイアウォールの内側にいたときに、この問題を発見しました。

私が理解できないのは、ファイアウォールの背後にいないため、グラフを見ることができるということですが、以下のコードをローカルで実行すると、グラフを見ることができますが、false.

ただし、を変更するport=3000と、true が返されます。私は何を間違っていますか?ありがとう!

4

2 に答える 2

0

1000 未満のポートはシステムによって保護されており、root 権限で実行する必要があります。一見すると、これは間違っていると思います。

于 2012-11-15T01:21:51.090 に答える
0

ポート 443 は、SSL (https) 接続の通常のチャネルです。企業がファイアウォールでこのポートにアウトバウンド制限を設定しているとしたら、非常に驚​​くでしょう。おそらく、制限されている可能性があるのはサイトの IP アドレスです。

コマンド ラインに移動し、telnet を試します。まず、Google など、機能することがわかっているものを試してください

> telnet google.com 443
> Trying 74.125.226.231...
> Connected to google.com.
> Escape character is '^]'.

Connected to google.com応答は、マシンがポートと IP アドレスへの接続に成功したことを示しています。そうしないと、Trying x.x.x.x...ラインでハングします。

もう 1 つの可能性は、イントラネットがプロキシ サーバーを経由するように設定されていることです。ネットワーク内のマシンに内部的に接続し、それが実際の接続を確立します。これを処理するために何をする必要があるのか​​ はわかりませんが、何か特別なことがあります.ブラウザにはプロキシサーバーを処理するための特別な設定があるため、Railsコードも同様に設定する必要があります.

于 2012-11-15T01:28:59.250 に答える