ITOさん aetosさん
レスありがとうございます。
「今やりたいこと」は、上のほうでも書きましたが以下のようなことです。
WANでもLANでも指定したIP(正確にはFQDN)を持つマシンを確認できる
ネットワーク上に自マシン(今回でいうところのpingするソフトをいれるマシン)
がWANまたはLANに接続されているかどうかを確認する方法です。
前提条件として
・pingが通らなければ同じネットワーク上ではないと判断してOK
(信頼性やネットワーク負荷は特に問題としない。)
・指定する相手は、pingを返す設定になっている。
・同じネットワーク上かどうか確認する相手にソフトをいれてはならない。
・自マシンで動かすソフトはサービスとして起動する。
確認したい状態は
指定したマシンからpingが返ってくるような状態かどうかを判断したい。
pingと同程度の信頼性で、指定したマシンが同じネットワーク上にいることを
確認できるのなら、pingによる確認にはこだわらない。
※pingと同程度というのが何を指すのか自分でもわかっていません。
だんだんと本題と外れてきていますが
私は用途の話ではなく方法の話に興味があります。
質問者はVISTAで管理者権限以下で自前でPingを送信したい。
だと思うのですが・・・。
IcmpSendEchoは何で出来るんでしょう?
ファイアウォールとかが気になるところだけど
俺ってその辺詳しくない。
あまり自分でソケットとかpingとかのプログラム書かないからな。
# あまり踏み込むのも気の毒(「やれ」と言われて逆らえない立場はお察しします)です
が…
> 指定したマシンからpingが返ってくるような状態かどうかを判断したい。
それを「何のために?」ということなのです。
その相手と通信したいわけでもないのに、何のためにそれを判断する必要があるの?
と。
ほんとに生存確認なのかも。
要するにLAN上にいるかを知りたいだけ。
何の為かは知らないけれど。
#ただ、pingの信頼性に依存した確認方法でわかった結果を持って
#これこれこの時にLANに居なかったから、社内に居なかったとか
#言われるのは嫌かも。(いえ、単なる想像ですが)
てんさん
wclrp ( 'o')さん
aetosさん
PATIOさん
レスありがとうございます。
「何のために?」については、仕事上のことになるので書けませんが
たとえば、あるPCと同じネットワーク上にいないときに
そのソフトを入れたマシンを起動すると警告を出すとか、
逆にあるPCと同じネットワーク上にそのソフトを入れたマシンを
起動すると警告を出すなどを行うためです。
つまり、勝手にそのマシンを他へ持っていくな!とか
逆に勝手にそのマシンをネットワークにつなげるな!とか
です。
> つまり、勝手にそのマシンを他へ持っていくな!とか
> 逆に勝手にそのマシンをネットワークにつなげるな!とか
俺なら
・ネットワーク全体に DHCP を導入し
・ DHCP サーバ側にて許可不許可のテーブルを作っておき
・監視は DHCP サーバマシン上にて IP アドレスリース状態から調べる
とするだろうな(現行ネットワークを大きく変えないなら)。
大きく変えていいなら AD でも構成するかな。
ネットワークに正しくつながれていないマシンはネットワークを正しく使えない
という構成を組むほうが先。
少なくとも ICMP のような不確かなプロトコルに頼る気は0
要件をみる限り、セキュリティ的な目的かと思いますが、であればなおのこと、安易な方
法で回避できる実装にすべきではないのでは?
>「何のために?」については、仕事上のことになるので書けませんが
> たとえば、あるPCと同じネットワーク上にいないときに
> そのソフトを入れたマシンを起動すると警告を出すとか、
> 逆にあるPCと同じネットワーク上にそのソフトを入れたマシンを
> 起動すると警告を出すなどを行うためです。
DHCP鯖があるという前提なら、対象PCをMAC前提で
固定IPにしておいて、そのIPを記憶。
立ち上げ時に自分自身がそのIPで起動してなかったら、アウト。
みたいな感じでいいような気がします。
老婆心ですが、もし「盗難防止」の様なセキュリティのために
その様なこと(ソフトプロテクト)を考えているとしたら、
まったくむだですよ。簡単にハックできます。
> つまり、勝手にそのマシンを他へ持っていくな!とか
> 逆に勝手にそのマシンをネットワークにつなげるな!とか
> です。
うーーん
ネットワークは誰が構築したのかですね。
1.すべてお客様が構築POTETOさんはほとんど知らない。
2.社内ネットワークで社内の誰かが構築、POTETOさんも内容
を知ることが出来る。
まぁー、そのネットワーク上にドメインコントローラがあればドメインを
登録してもらえばいいことだと思います。
あまり、PINGを使うとネットワークのセキュリティーにひっかかって、
不審者扱いされる可能性があります。
追記、
相手のサーバOSがWin2000Server以降で
ネットワーク上にドメインコントローラがあるのなら
ADが構成されている可能性が高いです。
ネットワーク管理者に問い合わせてください。
ADが構成されていれば、相手のサーバOSでAD用のSDKが
動くはずです。(詳細は調べてください。)
そうすれば、誰のドメインがネットワーク接続しているか分かるかもしれません。
(詳細は知らないのでどこまで可能か分からない。)
ドメイン名まで分からなくても何かしら情報を得ることが可能だと思います。
ネットワーク管理者の了解を取るだけなので、PINGを使うよりいいと思います。
仲澤さんがきにしています、セキュリティーの面も大丈夫だと思います。
AD=アクティブディレクトリーサービスです。
POTETOさんとは用途が違うとは思いますが、私も同様の事で悩んだ事があります。
私の場合は、DBサーバよりクライアントが先に立ち上がる環境で、DBサーバが起動して
いるかどうかを調べたい、といった用途でした。(ADは別途存在)
接続しに行ってタイムアウト待つより、とりあえずPING打って応答が無ければ何もせ
ず、応答が返って来だしたら少し待ってアクセスする事にするという手抜き仕様です。
この時は、PINGコマンドを叩いてPIPEで結果を受け取って文字列判断、という、これま
た超手抜きかつPINGの表示が変わったらどうするの?的なものでしたが、動けばいいレ
ベルのシステムだったのでこうなっています。
議論を見ていると、そもそものやり方がおかしいとの発言も見受けられますが、こんな
事をやっている人間もいるので、「もしやるとしたら」皆様がどのような方法を取られ
るのかを、私も聞いてみたいです。
接続してタイムアウトを待つ。
ping 打って返事が来たって、少し待ったって DB があがっている保証は何一つない。
結局のところタイムアウト処理を入れなきゃならないのは同じこと。
DB 側のセキュリティ向上で ICMP が Disable になったらどうする?
DB 側のマシンが更新されて立ち上がり速度が向上したら、待っている時間が無駄。
> 接続しに行ってタイムアウト待つより、とりあえずPING打って応答が無ければ
> 何もせず、応答が返って来だしたら少し待ってアクセスする事にするという
> 手抜き仕様です。
とりあえずPING打って応答が無ければ
「サーバーが立上がってない可能性があります待ちますか?」
というようなダイアログを出して待つ。
そうでなければ、すぐにAからの処理を行う。
PINGを打ちのは一度きりでオペレータから再度ここなうという指示がでたら、
接続を試みる。
A
指定回数以上タイムアウトで失敗したら、「接続不可能」というダイアログを出して
サーバを調べてもらうようメッセージを出す。
オペレータからの再接続の指示を待つ。
の繰り返しだと思います。
接続回数とポーリング間隔をオペレータが設定できるようにしておけばいい
と思います。
修正です。
PINGを打つのは一度きりでオペレータから再度ここなうという指示がでたら、
接続を試みる。
が正解です。