2012-02-28 11 views
4

192.168.1.X(X = 1〜255)の範囲のIPアドレス1〜255に6つのデバイスが設定されています。私はこのプログラムをpingに書いて、利用可能なIPアドレスを見て操作を実行します。しかし、実行に時間がかかる... これを実行するための迅速な方法をお勧めしますか?255のIPアドレスから利用可能なデバイスを見つける方法

フォークの利用も歓迎です...ここで

はプログラムです:

悪くないルビー1.9.3タイミングでテスト
server = "192.168.1" 
for i in (1...255) 
    system("ping -q -C#{timeout} #{server}.#{i} 2&>/dev/null") 
    if $?.exitstatus == 0 
    # operations 
    end 
end 
+2

'-c'は' timeout'ではなく 'count'です。タイムアウトを適用するには '-W'または/または' -w'を使います。別のスレッドで各pingを実行することでこれをスピードアップすることもできます。この場合、255 *タイムアウトではなく単一のタイムアウト後にすべての応答が得られます。 –

+1

または 'nmap -sn 192.168.1.0/24' ping scan: –

答えて

2

[[email protected] ~]$ time ruby ipmap.rb 
"192.168.0.1" 
"192.168.0.10" 

real 0m2.393s 
user 0m0.750s 
sys  0m1.547s 

操作をスレッド化したい場合は、この領域にコメントしました。

require 'ipaddr' 

ips = IPAddr.new("192.168.1.0/24").to_range 

threads = ips.map do |ip| 
    Thread.new do 
    status = system("ping -q -W 1 -c 1 #{ip}", 
        [:err, :out] => "/dev/null") 

    # you can do your operations in thread like this 
    # if status 
    # # operations 
    # end 

    # optional 
    Thread.current[:result] = ip.to_s if status 
    end 
end 

threads.each {|t| t.join} 

# if you don't do your operations in thread 
threads.each do |t| 
    next unless t[:result] 

    # operations 

    #optional 
    puts t[:result] 
end 
+1

[子プロセス](https://gist.github.com/1944010)を同じマシンに実装する方が高速です。 –

関連する問題