我知道Ruby有很多宝石,允许程序员编写一个非常美丽的代码。 默认情况下,此简短示例扫描子网192.168.1.x上的所有地址。
require 'ipscanner'
a = IPScanner.scan
#=> ["192.168.1.1", "192.168.1.4"]
如何获取计算机名称而不是ip?有没有实现Window API(NetBIOS)的gem? 也许最好使用smth。像解析'ipconfig / all'的macaddr http://rubygems.org/gems/macaddr(在我的情况下 - 'nbtstat')
答案 0 :(得分:2)
ipscanner gem看起来只是循环通过192.168.1。(1..254)并构建一个没有超出此行的ip地址数组:TCPSocket。new(ip_address) )
因此,一种方法可能是在给定IP地址的情况下反向查找主机名。看起来Socket class可以帮助您。
例如:
Socket.do_not_reverse_lookup = false
s = Socket.getaddrinfo(’66.249.67.49′,nil)
hostname = s[0][4]
或
host = Resolv.new.getname('66.249.67.49')
代码取自blog。
我在网络上没有任何计算机来测试这个,我对这些东西知之甚少,不知道IP上的计算机名称和IP上的主机名之间是否存在差异。如果上述方法不起作用,则不能太远。
答案 1 :(得分:1)
感谢@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"]