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我收到的真实。我究竟做错了什么?谢谢!

4

2 回答 2

0

1000以下的端口受系统保护,需要以root权限运行。乍一看,我猜这就是问题所在。

于 2012-11-15T01:21:51.090 回答
0

端口 443 是 SSL (https) 连接的正常通道——如果一家公司在其防火墙上对该端口设置出站限制,那将是相当令人惊讶的。更有可能的是,站点的 IP 地址可能会受到限制。

进入命令行并尝试使用 telnet。首先尝试一些你知道有效的东西,比如谷歌

> 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...在线上。

另一种可能性是您的 Intranet 设置为通过代理服务器 - 您在内部与网络中的机器建立连接,然后它反过来建立实际连接。这可能会把事情搞砸——不确定你需要做什么来处理它,但有些特别——浏览器有处理代理服务器的特殊设置,所以你的 Rails 代码也需要这样做。

于 2012-11-15T01:28:59.250 回答