Благодаря @ danneu.
Я написал простой пример, отлично работает на Windows 7. Проверьте политику брандмауэра (вы можете получить только ip вместо имени компьютера)!Имя компьютера является третьим параметром, поэтому используйте hostname = Socket.getaddrinfo ('192.168.1.10', nil) [0] [2].
require 'ipscanner'
Socket.do_not_reverse_lookup = false
IPScanner.scan.each {
|i|
puts "#{Socket.getaddrinfo(i, nil)}"
}
Вывод:
[["AF_INET", 0, "STARBOY", 192.168.1.2, 2, 0, 0]]
[["AF_INET", 0, 192.168.1.1, 192.168.1.1, 2, 0, 0]]
[["AF_INET", 0, "mcx-PC", 192.168.1.4, 2, 0, 0]]
Этот пример более нагляден и работает последовательно, ожидая завершения всех потоков.Тайм-аут Pingecho увеличен до 50 мс.
require 'ipscanner'
puts 'List of computers in your LAN. Please wait ...'
class IPScanner
# override scan method
def self.scan(ip_base = '192.168.1.', range = 1..254, t = 50)
computers = []
threads = []
Socket.do_not_reverse_lookup = false
(range).map {
|i|
threads << Thread.new {
ip = ip_base + i.to_s
if pingecho(ip, t)
computers << Socket.getaddrinfo(ip, nil)[0][2]
end
}
}.join
# wait for all threads to terminate
threads.each { |thread| thread.join }
return computers
end
end
puts "#{IPScanner.scan}"
Выход:
["STARBOY", "192.168.1.1", "mcx-PC"]