我发现我认为应该在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/