• ベストアンサー

pingを行うプログラム

Windows2000,VB6.0(sp5)の環境下でpingを行うプログラムの開発をしています。 API関数のIcmpSendEchoを使っているのですが、エラー時の処理がうまく制御できません。 この関数の返り値が"0"なら、エラー。"0"以外なら正常終了というようなことが HELPに書いてあったのですが、結果を"正常終了","タイムアウト","異常終了" の3つで判別するにはどのようにしたらいいのでしょうか? ご存知の方がいましたら教えてください。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

こんにちは >引数PING_TIMEOUTには、タイムアウトとみなすまでの任意の時間を指定する。 >結果は、STATUSでみる。STATUSの値が =IP_REQ_TIMED_OUTの場合、結果はタイム >アウトだった。 はい。そういう理解で良いです >Case PING_TIMEOUT: >というところがありますよね。 これは正しくはIP_REQ_TIMED_OUTの間違いだと思いますよ 一度、このサンプルをコピーして、有得ないIPアドレスで テストしてみてはどうでしょうか? Public Function GetStatusCode(status As Long) As String の中のSelect Case statusでブレイクさせて statusの値がどうなっているか。確認。 次は正しいIPアドレスでテスト。 その次は、LANケーブル抜いてテスト。 "タイムアウト","正常終了","異常終了" の3パターンで返ってくるstatusが限定できると思います。 では

noname#5252
質問者

お礼

サンプルを使って実際にテストした所、きちんと理解して、処理することが出来ました。 本当にどうもありがとうございました。

その他の回答 (4)

  • todo36
  • ベストアンサー率58% (728/1234)
回答No.5

では、 > 引数PING_TIMEOUTには、タイムアウトとみなすまでの任意の時間を指定する。 > 結果は、STATUSでみる。STATUSの値が =IP_REQ_TIMED_OUTの場合、結果はタイムアウトだっ > た。 > という理解で良いのでしょうか? いいと思います。 Ping成功の判定は、Status=0であり、送信文字列と受信文字列の一致した場合 とするべきかなと。 > サンプルの中で、STATUSを確認しているモジュールがありますが、その中に > Case PING_TIMEOUT: > というところがありますよね。 > STATUSの値が =PING_TIMEOUT の時も、タイムアウトしたと見なすと言うことなのでしょ これは#1のサンプルがおかしいと思います。

参考URL:
http://support.microsoft.com/default.aspx?scid=KB;en-us;300197&
noname#5252
質問者

お礼

Ping成功の判定は、~・・・ どうもありがとうございました。 本当に助かりました。

回答No.3

こんにちは ごめんなさい、私、ちょっと間違ってましたね IP_REQ_TIMED_OUTの方はIcmpSendEchoを実行した後のステータス の値と照合するための変数でタイムアウトしたときの(11000 + 10) という数値が設定されています サンプルでは実際、PINGを実行した後にどうだったか確認しています success = Ping((Text1.Text), (Text2.Text), ECHO) 成功した場合はsuccessにIP_SUCCESSの値がはいっているはずです タイムアウトしたときにはsuccessにIP_REQ_TIMED_OUTの値がはいる。 PING_TIMEOUTの方はIcmpSendEchoの引数で応答がない場合タイムアウト するまでの待ち時間を指定します。サンプルサイトでは500なので 0.5秒です。 では

noname#5252
質問者

補足

では、 引数PING_TIMEOUTには、タイムアウトとみなすまでの任意の時間を指定する。 結果は、STATUSでみる。STATUSの値が =IP_REQ_TIMED_OUTの場合、結果はタイムアウトだった。 という理解で良いのでしょうか? サンプルの中で、STATUSを確認しているモジュールがありますが、その中に Case PING_TIMEOUT: というところがありますよね。 STATUSの値が =PING_TIMEOUT の時も、タイムアウトしたと見なすと言うことなのでしょうか?

回答No.2

こんにちは >IP_REQ_TIMED_OUT >と >PING_TIMEOUT サンプルが英語ですが良く読みましょう!(^O^) IcmpSendEchoの引数 Timeout に指定する値ですね MSDNに "The time in milliseconds to wait for replies" とあります。1000が1秒ですね サンプルの方には Private Const IP_REQ_TIMED_OUT As Long = (11000 + 10) で11010ミリ秒なので11秒ちょい Private Const PING_TIMEOUT As Long = 500 は0.5秒 という設定値というわけです。 では

noname#5252
質問者

お礼

すみません。 ひょっとして、引数のTimeoutのところには、こちら側から○msec返事が来なかったらタイムアウト!と指定できるのではないと言う事なんでしょうか? 500msecと決まっているのでしょうか? それで返事が来た時に、その時間(Statusに入ってくる値?)とCONSTで定義した値を比較して一致したら、どういう状況だったかがわかるという流れなんでしょうか? うーん、分からない点をうまく説明できないんですが、自分はずっと、引数のTimeoutの所には、任意の値を指定できると思っていました。 この考えが間違いだったのでしょうか?

noname#5252
質問者

補足

なんかよく読んでも分からないんですが・・・ それらの定数は、IcmpSendEchoを実行したときに引数のStatusとして返される値の一覧ではないのでしょうか? それらの定数を引数のTimeoutのところに指定しなさいって事なんですか?で、失敗したらTimeoutに指定した値がそのまま返って来るということなんでしょうか? 本当に馬鹿ですみません。 教えてください。 お願いします。

  • todo36
  • ベストアンサー率58% (728/1234)
回答No.1

サンプルをどうぞ

参考URL:
http://www.mvps.org/vbnet/code/internet/ping.htm
noname#5252
質問者

お礼

ありがとうございました。 もう一つ聞いてもよろしいでしょうか? きっとすごく基礎的な事だろうと思うのですが、Statusに IP_REQ_TIMED_OUT と PING_TIMEOUT とありますが、どう違うのでしょうか?

noname#5252
質問者

補足

もう一つ質問なんですが、 IcmpSendEchoの最後の引数にタイムアウト値を設定しますが、この時間待っても返答が得られなかった場合は、この関数は、引数に指定したタイムアウト値と同じ結果を返すのでしょうか?

関連するQ&A