Ho bisogno di un modo rapido per scoprire se una determinata porta è aperta con Ruby. Io attualmente sto trafficando con questo:Ruby: verifica se una porta è aperta
require 'socket'
def is_port_open?(ip, port)
begin
TCPSocket.new(ip, port)
rescue Errno::ECONNREFUSED
return false
end
return true
end
Funziona benissimo se la porta è aperta, ma il rovescio della medaglia è che a volte sarà solo sedersi e aspettare per 10-20 secondi e poi alla fine timeout, gettando un'eccezione ETIMEOUT
(se la porta è chiusa). La mia domanda è quindi:
Questo codice può essere modificato per attendere solo un secondo (e restituire false
se non si ottiene nulla indietro allora) o c'è un modo migliore per verificare se una determinata porta è aperta su un determinato host ?
Modifica: La chiamata di codice bash è accettabile anche se funziona su più piattaforme (ad esempio, Mac OS X, * nix e Cygwin), anche se preferisco il codice Ruby.
funziona come un fascino! Grazie! –
Ho avuto qualche problema con questo blocco (credo). Fondamentalmente il timeout non sarebbe in realtà timeout. Non so perché, ma la soluzione netcat ha funzionato bene al suo posto. –
Questa risposta ha una soluzione che funziona anche su Windows: http://stackoverflow.com/a/3473208/362951 – mit