続・なかなか無い

ARPingの問題は片付いていないのだけれど、、、
それよりも、ちょっと気になる事があって。

実際、例えば24ビットマスクのネットワークとかだったら、スキャンするのに最低でも254回はARPを投げて、しばらくモニタして・・・を繰り返す事になる。仮にARPを投げるのに0.1秒、モニタ時間を1秒としても、1.1秒×254=280秒・・・おおよそ5分弱掛かる事に。
それでも良いけど、あまりにもアホな方法なんで、もちっと早く出来ないのかと。


まず、考えたのが一連のチェックをfork()して、子プロセスにお任せする方法。当然、子プロセスは作れるだけ作って・・・とか考えたけど。101号室によるとWindowsのActivePerl上ではfork()出来る数に制限があるっぽい。。。(それ以前にActivePerlではfork()は内部的にスレッドにおきかえられるそうだ。)

なんで、Threadsでテストしてみた。
なぁんか、マルチスレッドってPerlっぽくないつーか、お手軽っぽくないけど(^^;


で、ネットワークへの負荷とか、メモリの消費量とか、CPUの負荷率がどのくらいかとかいった事・・・どこまで並行で動かせるか・・・を、試してみたけど、実際にテストしてみると、16個くらいスレッドを作っただけで200MBとかメモリ消費するし。それ以前にあまりに沢山(64個とか)動かすと、パケットの取りこぼしもおこるし。ま、使い物にはなりませんでした。Threadを発行するタイミングを微妙にずらしてやる事でかなり改善出来たけど。。。
※当然、Perlからsystemでシェル上のコマンドを呼んで・・・というハナシで。

PerlのThreadsはメモリ食いだわ(^^;
とっても楽ちんだけど。。。





あわよくば、1IPだけチェックするユーティリティ(exe)を作って、Perlでマルチスレッド化してやればかなり楽ちんだとか考えてたけど、、、ダメかな?
(Windows版のArpingがあれば、そのまんま、、、PerlからはArpingをsystemで呼んで、結果を判断してやれば良いだけだから、お手軽だったんだけど・・・)


実際にやろうとしてる事は簡単なんだけどねぇ。
重複IPのチェックを行って、結果をWindowsのポップアップなり、SNMP Trapなり、メール送信なり、、、好きな方法で管理者に通知出来れば良いだけだし。(そこまでできあがれば、cronと組み合わせれば、定期的に重複IPを検出して、通知するまでが出来上がり)


時間さえあれば、真面目にC++だけで作り込んで・・・フリーソフト化するのが良いんだろうけど。



それにしても、こんな簡単なツールっていうかユーティリティを誰も作ってないってのは、不思議だ。
それほど需要が無いのかも知れない。
利用者が好き勝手にネットワークに接続出来るような無法地帯だったら、欲しくなるツールなんだけどね。


アイディアとしては・・・
Arpでスキャンするツールをネットワーク・セグメント毎にエージェントとして置いて、それらを束ねるマネージャを作り(当然その間はTCPかUDPで通信させる)、そこから一元的に通報を飛ばす・・・と便利だろうなぁ。とか。
あくまで、暇があればのハナシだけど(^^;