VC++でRAWソケットを作成してpingを行う処理を
書いて実行するとWindows 2000やXPでは期待通りの
結果が得られたのですが、Windows Vistaでは
recvで失敗してWSAGetLastErrorで10060(応答なし?)
が返ってきていました。
VistaではRAWソケットを使う時、XPまでとは
違う何か設定?かなにかが必要なのでしょうか?
ICMP.DLLでIcmpSendEchoを使うとVistaでもpingできましたが
Winsockを使う必要があり悩んでいます。
開発環境
Windows XP
VC++2005
同様にRAWソケットでpingを実装していましたが
「管理者として実行」以外だとSocketの作成時に
10013
アクセス許可で禁じられた方法でソケットにアクセスしようとしました。
が発生し先に進めませんでした。
ので「常に管理者として実行」または
POTETO さんの試したICMP.DLLでIcmpSendEcho
の方法で回避しようと思っています。
#VISTA SP1からっぽいですね。
てんさんへ
レスありがとうございます。
「常に管理者として実行」の方法は、UAC機能そのものを無効に設定するか
対象exeのショートカットでユーザ毎に管理者として実行する設定する
必要があるのですよね?
UAC機能そのものを無効にすることは許されておらず、また、
サービスで常時他PCを監視したいためショートカットでユーザ毎に
設定することは出来ないと考えています。
pingによる他PCの監視って今までにも仕事で結構見てきた
つもりですが、Vistaになってから皆さんはどのように
対応しているのでしょうか?
他に代わる方法があれば合わせてお聞きできればと思います。
ping で監視ってのがそもそも原理的に無意味なのでやるべきではない
てのが結論だと思うが。
Firewall で ICMP をドロップする設定などごく普通に行うわけだし。
そもそも ping の使うネットワーク帯域は無駄以外の何者でもないわけだし。
Dialup で使っているユーザーが ping のためだけに dial されたなら
激怒すること間違いないと思うぞ。
超遠隔地と VPN してたら ICMP も正式にタイムアウトしかねないし。
適切なタイムアウト時間を設定した上で、使いたいプロトコルだけを使う。
これ以外にネットワークを正しく使う方法はない。
tetrapodさんへ
レスありがとうございます。
もちろんICMPで監視する先はpingが通ることが前提となっています。
で、監視相手に通信用のソフトなど特別なものをいれては
ならない状況のため、たとえば相手先とTCP/IPで通信して定期的に
生存確認のための通信をするなどは行えないと思っています。
監視相手(Windows2000,XP,Vista)が同じネットワーク上で
存在(起動)していることを確認する手段として、pingが
使えないとなると何を使えばよいのでしょうか?
監視相手にそれ相応のソフトをいれなければ、そもそも
存在を確認することは不可能(というかしてはいけない?)
ものなのでしょうか?
ユーザー側にpingを使った生存チェックを行なった場合に
どういったメリットとデメリットがあるのかと言う部分を
きちんと説明していて、かつ、ユーザーの理解を得られているのであれば、
手段の一つとして考えるのは有りなのではないかなと思います。
チェックするPCが増えた時にpingが飛びまくってしまうとか
諸々の状況まで想定されていれば良いのではないかなぁ。
pingと言えど、短い間隔で大量に飛べば馬鹿にならないと思いますし。
逆に言えば、そういう部分の想定をきちんとしてますかという話かと。
俺と POTETO 氏とで、そもそもの前提条件が違うものと思う。
俺は WAN レベルの話をしている。
POTETO 氏は LAN レベルの話をしているのだと (俺は勝手に) 思う。
だがどこにも LAN 限定だと書いていないので、俺は WAN レベルで考察している。
WAN レベルでは ICMP ECHO しないのはごく普通の話である、とただそれだけのこと。
こういう話題は結構あちこちで見かけるわけなんだが、議論の前提として
そもそも「生存確認」とは何?という話からはじめなきゃいけないわけさ。
マシンの電源が落ちていること?
OS が起動していること?
Firewall でブロックされていないこと?
有線なら LAN ケーブルが抜けていると生存なの死亡なの?
無線なら無線アダプタが省電力モードに入っている時は生存なの死亡なの?
俺は ICMP ECHO が帰ってくることをもって「生存」と呼ぶことはしない。
だからそんなチェックはするだけ無駄、と主張しているわけだ。
Web server の生存は http に対して返事を行うかどうかで必要十分。
といいたいだけ。
POTETO 氏にとっての「生存」とは何? ICMP ECHO すること?
それならば ping することで「生存」確認できるだろう。
PATIOさん tetrapodさん
レスありがとうございます。
元々聞きたかった内容が、RAWソケットでのpingを
Vistaで行うためには?だったこともあり、
それだけでは良い解決策を得ることが難しそうなため
問題を生存確認にすりかえてしまい、説明が後付けに
なってすみません。
「生存」の意味については、その時々により変わってきますが、今知りたいことは
WANでもLANでも指定したIP(正確にはFQDN)を持つマシンを確認できる
ネットワーク上に自マシン(今回でいうところのpingするソフトをいれるマシン)
がWANまたはLANに接続されているかどうかを確認する方法です。
上記のような状態を確認するためにpingという方法を使おうと
思いました。(というか要求されました。)
このため、「生存」とは必ずしも「ICMP ECHO すること」では
ありませんが要求されている方法がpingであり、また、自分自身も
実現する方法をpingしか知らないため、どう実現すればよいかを
お聞きしたくて質問しました。
しかし、話を聞いているうちにping以外に方法がありそうかも?
ということで、その他に良い方法があれば教えていただきたいと
思い話題を生存確認にした次第です。
お客様からそういう提案があったとしたら、俺なら
・まず ICMP ECHO に意味がないことを説明し
・そもそも「生存」チェック自体に意味がない、と逆提案し
・丁寧にお断りする
というレベルの話だと思う
http://www.kt.rim.or.jp/~ksk/wskfaq-ja/newbie.html
2.13 より引用
最後に ping テクニックの問題としては、ICMP は信頼性のないプロトコルである
という点があげられます。あるプロトコルの信頼性を保証するために、
信頼性のないプロトコルを使うなんて、一体全体何の意味があるってんだい?
通信しない相手が生きていても死んでいてもどうでもいい話→
本来通信すべきプロトコルで話しかけて返事があるかどうかだけわかれば必要十分
これ以上何がいるの?
うーーん
POTETOさんとPATIOさん、tetrapodさんとの間で意見が食い違っている感じが
しますね。
>「常に管理者として実行」の方法は、UAC機能そのものを無効に設定するか
> 対象exeのショートカットでユーザ毎に管理者として実行する設定する
> 必要があるのですよね?
そもそも、「PING」のツールは、ネットワーク上で何ら障害が起きたときに
どこに障害が出たかを調べるものです。もちろんトラブルですから、外との
接続も一時切断し、Firewall等も一時停止させます。
つまり、「他のネットワークに支障のない状態」にして使うものです。
あと、「PING」のツールはネットワークの構築時にも使います。
あらかじめ設計したトロボジによってPCを配置接続、OS・ネットワーク設定
を行った時点(まだFirewall等のツールをインストールしていない時点)で
PCがみんな繋がっているか調べるときに使います。
つまり、人為的過失・ケーブル切断等の故障がない限りネットワークは100%
繋がっているということでいいと思います。
お客様側のネットワーク管理者から示されたネットワーク接続表に基づいて
通信を行い、
> recvで失敗してWSAGetLastErrorで10060(応答なし?)
> が返ってきていました。
このようなことが起きたら、アラームを出せばいいと思います。
ひとつの例として、
もし、「どうしてもPINGで調べてほしい。」という依頼であれば、別途で専用アプリを
用意しネットワーク管理者扱いにしてもらえばいいと思います。
tetrapodさんに基本的に賛成。
一般に、当該アプリ(同士)の通信時にのみ
つながっているかどうかわかれば十分、ただし、
障害時用バックアップマシンと、通常運用用マシン間
などでは、両者に生存確認が必要な場合も多いです。
この場合でも、独自形式での通信で生存確認できれば十分。
というか、pingなんかよりはるかに確実で便利。
当該アプリがハングアップしているマシンにpingが
通っても、何のなぐさめにもなりません(^^;)。
> 当該アプリがハングアップしているマシンにpingが
> 通っても、何のなぐさめにもなりません(^^;)。
たしかにそうですね。
求めている状態って何?って話になりますからねぇ。
pingの場合、pingだけが生きていても実際にやりたい事が
出来なきゃ意味がない。
で、何の為の生存チェックなの?と言う話になります。
クライアント-サーバーの構成であれば、
そのアプリ間でやら無いと意味がない。
そうでないなら、どういう状況を知りたくてやっているのか?
特定のマシンの電源がONかどうかを知りたいのであれば、
pingは確実な方法ではないですね。
電源がONでもpingが通るとは限らないだろうし。
そのマシンがpingに答えられる状態有るかをチェックしたいなら
まだわからなくもないですけれど、プロトコル的に相手が
繋がる状態であっても返信を保証していないのであれば、
どれだけ意味があるのかは疑問ですね。
それそこ大体当たっていれば良い程度の話ならそれでも良いのかもしれませんけれど。
tetrapodさん
ITOさん
仲澤@失業者さん
PATIOさん
レスありがとうございます。
今やりたいことが他のマシンとなんらかのプロトコルで通信する
ことではないため、他のマシンがいることを確認するために
自マシンと通信するためのソフトを入れれない状況です。
皆さんが言っている方法は分かるのですが、現状では自マシン以外に
ソフトを入れることが出来ない(許可されない)ので、実現したい
ことは不可能ということになるのかな。
> 今やりたいことが他のマシンとなんらかのプロトコルで通信する
> ことではないため、他のマシンがいることを確認するために
> 自マシンと通信するためのソフトを入れれない状況です。
「今やりたいこと」が分からないと、皆さん答えが出せないと思います。
「相手が生きていることを確認すること=やりたいこと」なのではなく、「何のために
生存確認をする必要があるのか?」というところを説明する必要があるのではないでし
ょうか?
その上で、ping では目的を達成できないことを実演して見せれば早いかもしれません。