2010-08-12 27 views

回答

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()的代碼不能在Windows使用Ruby 1.9的工作? 1(它適用於其他操作系統)。

+0

正是我需要的。非常感謝您的片段! – chromeeagle 2010-08-15 06:15:37

+0

FWIW https://stackoverflow.com/a/38266268/537897從Ruby 2.0開始 – 2017-06-13 09:00:35

0

這可能是由於Rubys Timeout庫的一些固有問題。您可以通過直接訪問底層套接字庫並在Socket上設置超時來實現此目的。這article涵蓋了一些深度,儘管它假定* nix,所以你可能有一些問題與Windows,我不知道有多類似的套接字實現。

+0

感謝有趣的鏈接,史蒂夫。很有幫助!!! – chromeeagle 2010-08-15 06:14:51