プロが教えるわが家の防犯対策術!

Windows2000,VB6.0(sp5)の環境下でpingを行うプログラムの開発をしています。

API関数のIcmpSendEchoを使っているのですが、エラー時の処理がうまく制御できません。
この関数の返り値が"0"なら、エラー。"0"以外なら正常終了というようなことが
HELPに書いてあったのですが、結果を"正常終了","タイムアウト","異常終了"
の3つで判別するにはどのようにしたらいいのでしょうか?

ご存知の方がいましたら教えてください。
よろしくお願いします。

A 回答 (5件)

こんにちは



>引数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が限定できると思います。

では
    • good
    • 0
この回答へのお礼

サンプルを使って実際にテストした所、きちんと理解して、処理することが出来ました。

本当にどうもありがとうございました。

お礼日時:2002/11/14 22:55

では、


> 引数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=K …
    • good
    • 0
この回答へのお礼

Ping成功の判定は、~・・・

どうもありがとうございました。
本当に助かりました。

お礼日時:2002/11/14 22:56

こんにちは



ごめんなさい、私、ちょっと間違ってましたね
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秒です。

では

この回答への補足

では、
引数PING_TIMEOUTには、タイムアウトとみなすまでの任意の時間を指定する。
結果は、STATUSでみる。STATUSの値が =IP_REQ_TIMED_OUTの場合、結果はタイムアウトだった。

という理解で良いのでしょうか?

サンプルの中で、STATUSを確認しているモジュールがありますが、その中に
Case PING_TIMEOUT:
というところがありますよね。
STATUSの値が =PING_TIMEOUT の時も、タイムアウトしたと見なすと言うことなのでしょうか?

補足日時:2002/11/14 14:23
    • good
    • 0

こんにちは



>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秒
という設定値というわけです。

では

この回答への補足

なんかよく読んでも分からないんですが・・・

それらの定数は、IcmpSendEchoを実行したときに引数のStatusとして返される値の一覧ではないのでしょうか?
それらの定数を引数のTimeoutのところに指定しなさいって事なんですか?で、失敗したらTimeoutに指定した値がそのまま返って来るということなんでしょうか?

本当に馬鹿ですみません。
教えてください。
お願いします。

補足日時:2002/11/14 12:15
    • good
    • 0
この回答へのお礼

すみません。

ひょっとして、引数のTimeoutのところには、こちら側から○msec返事が来なかったらタイムアウト!と指定できるのではないと言う事なんでしょうか?
500msecと決まっているのでしょうか?

それで返事が来た時に、その時間(Statusに入ってくる値?)とCONSTで定義した値を比較して一致したら、どういう状況だったかがわかるという流れなんでしょうか?

うーん、分からない点をうまく説明できないんですが、自分はずっと、引数のTimeoutの所には、任意の値を指定できると思っていました。
この考えが間違いだったのでしょうか?

お礼日時:2002/11/14 14:11

サンプルをどうぞ



参考URL:http://www.mvps.org/vbnet/code/internet/ping.htm

この回答への補足

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

補足日時:2002/11/13 22:23
    • good
    • 0
この回答へのお礼

ありがとうございました。

もう一つ聞いてもよろしいでしょうか?
きっとすごく基礎的な事だろうと思うのですが、Statusに
IP_REQ_TIMED_OUT

PING_TIMEOUT
とありますが、どう違うのでしょうか?

お礼日時:2002/11/13 22:04

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています