プロジェクトの環境整備のためにツールを開発中。
指定した範囲の IP アドレスに対して
結果はとりあえず ListView に出力。
ListView は 3列構成で、IP アドレス、ホスト名、MAC アドレスを表示。
PING が timeout になったりホスト名が取れない場合、ListView のその項目は空白のまま。(IP アドレスは必ず出力する)
ここまでは Vector あたりに沢山ツールが置いてあるわけですが、指定した範囲のアドレスに対して 1回舐めるだけじゃなく、指定した回数繰り返し処理したいわけです。
対象にしている LAN は管理ができていないカオスな所でして、「ちょっと電源を入れて 10分ぐらい作業してすぐに落としちゃう」 てな端末を取り逃したくないわけですわ。
それと [以前の続きで調査] てな機能も必要。
ListView 上の Item を舐めていきながら(IP アドレスは書き出してあるので)ホスト名か MAC アドレスが空白のノードだけ処理するモード。
てな要望を書き出していたら、このツール、素直に考えると単なる DoS 攻撃ツールなんじゃないかと。。。
んじゃぁせめて繰り返し時のインターバルを設定できるようにしようじゃないか、と。
指定した範囲の IP アドレスに対して
- PING を打つ
- MAC アドレスを取得
- ホスト名を取得
結果はとりあえず ListView に出力。
ListView は 3列構成で、IP アドレス、ホスト名、MAC アドレスを表示。
PING が timeout になったりホスト名が取れない場合、ListView のその項目は空白のまま。(IP アドレスは必ず出力する)
ここまでは Vector あたりに沢山ツールが置いてあるわけですが、指定した範囲のアドレスに対して 1回舐めるだけじゃなく、指定した回数繰り返し処理したいわけです。
対象にしている LAN は管理ができていないカオスな所でして、「ちょっと電源を入れて 10分ぐらい作業してすぐに落としちゃう」 てな端末を取り逃したくないわけですわ。
それと [以前の続きで調査] てな機能も必要。
ListView 上の Item を舐めていきながら(IP アドレスは書き出してあるので)ホスト名か MAC アドレスが空白のノードだけ処理するモード。
てな要望を書き出していたら、このツール、素直に考えると単なる DoS 攻撃ツールなんじゃないかと。。。
んじゃぁせめて繰り返し時のインターバルを設定できるようにしようじゃないか、と。
んで久しぶりに Visual Studio 2005 を起動して C# で書き始めたわけでございますが、調査中の処理はスレッドを分けたほうがいいと気づいてからが地獄。。。
System.Threading.Thread searchJob = New System.Threading........
処理クラスに開始アドレスと終了アドレスを渡してあとは丸投げ。でも 1件終了するごとにフォームの ListView に ListViewItem を追加する必要がある。てことは処理クラスで 1アドレスに対する処理が終わる度にイベントを発生させる必要がある。
独自の Got イベント...OnGot...delegate...eventHandler...event...sender...e...
ループが終わって全ての処理が終了した時もイベントを発生させたいな。
独自の Complete イベント...OnGot...delegate...eventHandler...event...sender...e...
途中で処理を中止したときにもイベントを発生させたいな。
独自の Canceled イベント...OnGot...delegate...eventHandler...event...sender...e...
んで呼び出し元の Got イベント内で ListView に ListViewItem を追加する処理を書いたらエラー発生。フォーム上のコントロールをいじるのはフォームのスレッドじゃないとダメらしく、独自に作成した処理スレッドからだとエラーになるらしい。また色々調べた結果またしてもデリゲートとか出てきた。
delegate...Invoke...
はぁ。。。疲れた。。。イベント発生と処理に関しては理解できたと思うけど別スレッドからフォームのコントロールをいじる所が消化不良。。。
あとは [処理中止] ボタンから処理クラスの Cancel メソッドを呼び出して、処理クラスのループの中でキャンセル フラグを監視。フラグが立ってれば安全に処理を中止して Canceled イベントを発生。てな処理の実装。(これはまぁ今のオイラにとっては簡単かな)
それと [以前の続きで調査] の実装だよなぁ。
これも処理自体は処理クラスに任せられるけど、ListViewItem を追加する必要はないし、値が入っている項目は上書きしちゃいけないし。どうやって実装しましょうか。。。
System.Threading.Thread searchJob = New System.Threading........
処理クラスに開始アドレスと終了アドレスを渡してあとは丸投げ。でも 1件終了するごとにフォームの ListView に ListViewItem を追加する必要がある。てことは処理クラスで 1アドレスに対する処理が終わる度にイベントを発生させる必要がある。
独自の Got イベント...OnGot...delegate...eventHandler...event...sender...e...
ループが終わって全ての処理が終了した時もイベントを発生させたいな。
独自の Complete イベント...OnGot...delegate...eventHandler...event...sender...e...
途中で処理を中止したときにもイベントを発生させたいな。
独自の Canceled イベント...OnGot...delegate...eventHandler...event...sender...e...
んで呼び出し元の Got イベント内で ListView に ListViewItem を追加する処理を書いたらエラー発生。フォーム上のコントロールをいじるのはフォームのスレッドじゃないとダメらしく、独自に作成した処理スレッドからだとエラーになるらしい。また色々調べた結果またしてもデリゲートとか出てきた。
delegate...Invoke...
はぁ。。。疲れた。。。イベント発生と処理に関しては理解できたと思うけど別スレッドからフォームのコントロールをいじる所が消化不良。。。
あとは [処理中止] ボタンから処理クラスの Cancel メソッドを呼び出して、処理クラスのループの中でキャンセル フラグを監視。フラグが立ってれば安全に処理を中止して Canceled イベントを発生。てな処理の実装。(これはまぁ今のオイラにとっては簡単かな)
それと [以前の続きで調査] の実装だよなぁ。
これも処理自体は処理クラスに任せられるけど、ListViewItem を追加する必要はないし、値が入っている項目は上書きしちゃいけないし。どうやって実装しましょうか。。。
コメント