ruby - 使用 Timeout::timeout(n) 缩短套接字超时似乎对我不起作用

标签 ruby sockets connection-timeout

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

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

最佳答案

以下代码似乎适用于 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 上运行(它可以在其他操作系统上运行)。

关于ruby - 使用 Timeout::timeout(n) 缩短套接字超时似乎对我不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3464551/

相关文章:

ruby-on-rails - 在 Heroku 上部署 Rails 2.3.16 应用程序,尝试迁移数据库,rake 中止!无法加载此类文件 -- iconv

c - 如何同时从标准输入和套接字进行轮询?

java - 将变量设置为客户端套接字

c - 关于 C 中原始套接字的查询很少

java - 如何解决无法获取隔离的 JDBC 连接的问题?

python - rmul 有等效的 ruby​​ 吗?

ruby-on-rails - rails : Bundler could not find compatible versions for gem "actionpack" on installing ActiveAdmin

ruby - 使用 RVM 安装 Ruby 时出现需求错误

sql-server - SQL Server的远程登录超时设置是否等同于在连接字符串中设置连接超时值?

javascript - 事件源在 45 秒内超时