ページ 11

ネットワーク接続状態の取得方法

Posted: 2008年1月22日(火) 16:03
by Moon
はじめまして。
いきなりの質問で申し訳ありませんが、ネットワークに接続しているかどうか、というかネットワークケーブルがささっているかどうかを知るにはどうしたらよいのでしょうか。
現在、ネットワーク上のコンピューターのファイルにアクセスできるかどうかで判断しているのですが、ネットワークに接続していない場合、少し判断に時間がかかってしまう為、瞬時に判断できるようにしたいのですが・・・。

Posted: 2008年1月22日(火) 16:36
by ゲスト
ケーブルが接続されていてもサーバや回線に問題が有れば同じになります。
サーバに接続してみる方が確実だと思います。
(ケーブルを確認する方法を知らないので言い訳です。)

WindowsやSMB等のファイル共有であればAPIのWNetAddConnectionあたりを使えば待つ事はありません。

Posted: 2008年1月22日(火) 19:27
by Moon
返答ありがとうございます。
WinXPでネットワークケーブルを引っこ抜くと、タスクバーに「ケーブルが接続されていません」という表示がでるので、何か簡単にわかる方法があるのかと思い聞いてみた次第です。
教えていただいた WNetAddConnection を使ってみようと思ったのですが、自分なりに調べて試してみたものの、きちんと動作させることができていません。
上記コードを実行すると、エラーコード487(ERROR_INVALID_ADDRESS)が返ってきます。Function の定義の仕方とか見よう見まねでやっているので、おかしいのかもしれないのですが、よくわかりません・・・。WNetAddConnectionの正しい使い方を教えていただけないでしょうか。

Posted: 2008年1月23日(水) 20:16
by ゲスト
Function定義は大丈夫ですよ。
サバーが見つからないのでは・・・

Posted: 2008年1月23日(水) 20:27
by ゲスト
追伸です。
私は下記で試しました。 マイクロソフトが推奨していますので、これができたらWNetAddConnection2か3に挑戦してみてください。

Posted: 2008年1月24日(木) 10:26
by Moon
ゲストさんのコードを見て気付いたのですが、第3パラメータが間違っていたようです。

× ret=WNetAddConnection("\\hoge\hoge", NULL, NULL)
○ ret=WNetAddConnection("\\hoge\hoge", NULL, "")

MSDNを見たら「NULL を指定すると、ローカルデバイスのリダイレクトなしでネットワーク資源に接続します。」とあったのでNULLにしていたのですが、”NULL”ではなくて”NULL文字列”のことだったんですね・・・。

上記修正でWNetAddConnectionはきちんと動作するようになったのですが、ネットワークに接続していない場合、やはり関数が戻ってくるまで時間がかかってしまい(2~3秒くらい)、残念ながら当初の目的には合致しないようです・・・。WNetAddConnection2, 3 も試してみましたが、やはり判断に時間がかかってしまいます。
何かいい手段はないものでしょうか?

Posted: 2008年1月24日(木) 11:01
by ゲスト
あらら、数秒もNGですか。
では、Pingを打ってみてはどうでしょう?
UDPなのでリトライ無しと言う訳にはいきませんが、小さいネットワーク内で
利用するならタイムアウト値を小さくすれば何とかなると思います。

私は試した事が無いのですが、過去の掲示板に記載が有りました。
(ABのバージョンが違うので少し手直しが必要だと思います。)

Posted: 2008年1月24日(木) 13:37
by Moon
ありがとうございます。教えていただいたPINGで試してみたところ、時間をかけずにネットワーク接続を判断することができました。なお、私はAB4.23を使用していますが、コードは全く変えずにそのままで動作しました(最終的に自分のプログラムに組み込む際には変更を加えましたが)。
色々と助言をいただき、大変助かりました。ありがとうございました。