2

我发现我认为应该在https://stackoverflow.com/questions/517219?tab=oldest#tab-top上完美运行,但是它对我不起作用。

我在 Windows 上安装了 Ruby 1.9.1,当我尝试示例“is_port_open”测试时,它不起作用。无论我为超时设置什么值,套接字调用仍然需要大约 20 秒才能超时。任何想法为什么?

4

2 回答 2

5

以下代码似乎适用于 Windows 上的 ruby​​ 1.9.1:

require 'socket'

def is_port_open?(ip, port)
  s = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
  sa = Socket.sockaddr_in(port, ip)

  begin
    s.connect_nonblock(sa)
  rescue Errno::EINPROGRESS
    if IO.select(nil, [s], nil, 1)
      begin
        s.connect_nonblock(sa)
      rescue Errno::EISCONN
        return true
      rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH
        return false
      end
    end
  end

  return false
end

我还没有弄清楚为什么原来的 is_port_open?() 代码不能在带有 ruby​​ 1.9.1 的 Windows 上工作(它在其他操作系统上工作)。

于 2010-08-13T01:12:50.093 回答
0

这可能是由于 Rubys Timeout 库的一些固有问题。您可以通过直接访问底层套接字库并在 Socket 上设置超时来实现这一点。本文深入介绍了这一点,尽管它假设 *nix 因此您可能对 Windows 有一些问题,但我不确定套接字实现有多相似。

于 2010-08-12T06:57:23.950 回答