我發現我認爲應該在https://stackoverflow.com/questions/517219?tab=oldest#tab-top上完美工作,但它不適用於我。使用Timeout :: timeout(n)縮短套接字超時似乎不適用於我
我在Windows上安裝了Ruby 1.9.1,當我嘗試示例「is_port_open」測試時,它不起作用。無論我爲超時設置什麼值,套接字調用仍需要大約20秒纔會超時。任何想法爲什麼?
我發現我認爲應該在https://stackoverflow.com/questions/517219?tab=oldest#tab-top上完美工作,但它不適用於我。使用Timeout :: timeout(n)縮短套接字超時似乎不適用於我
我在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()的代碼不能在Windows使用Ruby 1.9的工作? 1(它適用於其他操作系統)。
這可能是由於Rubys Timeout庫的一些固有問題。您可以通過直接訪問底層套接字庫並在Socket上設置超時來實現此目的。這article涵蓋了一些深度,儘管它假定* nix,所以你可能有一些問題與Windows,我不知道有多類似的套接字實現。
感謝有趣的鏈接,史蒂夫。很有幫助!!! – chromeeagle 2010-08-15 06:14:51
正是我需要的。非常感謝您的片段! – chromeeagle 2010-08-15 06:15:37
FWIW https://stackoverflow.com/a/38266268/537897從Ruby 2.0開始 – 2017-06-13 09:00:35