ページ 11

インターネットの接続状態を取得したい

Posted: 2013年12月26日(木) 01:38
by だんごさん
windowsでインターネットに接続できるかを取得したいだけなのに調べてみると良い方法が出てこずに困っています。
まず、InternetAttemptConnectは「接続環境」を調べるので使えず、InternetCheckConnectionは接続できないときに一時フリーズする致命的なことが起こるので使えません。(マルチスレッドはアプリの仕様上避けたいです)
InternetGetConnectedStateは引数の使い方がいまいち分からず正しく取得できない(戻り値も正しくない)、またキャッシュを使っているのか環境によって反映までが長かったりするらしく、使い勝手が悪かったです。(自分のせいでもありますが…)

他にいい方法、もしくは取得できるならInternetGetConnectedStateの使い方を教えていただけないでしょうか?
よろしくお願いいたします。

Windows7
C言語
VC++2010E

Re: インターネットの接続状態を取得したい

Posted: 2013年12月26日(木) 04:54
by h2so5
具体的にどのような状況を「インターネットに接続できる」と考えているのでしょうか。

例えばGoogleを利用できるかどうかは、実際にgoogle.comに接続してみないと分かりません。
こちらの環境に問題がなくても、向こうのサーバーに問題があるかもしれないからです。

Googleを利用するアプリケーションにとって、yahoo.comに接続できるがgoogle.comに接続できないような状況は、
インターネット接続が利用できないのと同じことです。

google.comのような外部のサーバーにHTTPで接続できても、ポートが制限されていてFTP接続ができない環境もあります。
その場合はFTPを使うアプリケーションにとっては、インターネット接続が利用できないのと同じことです。

オンライン状態の基準を明確にしないと判断しようがないと思います。

Re: インターネットの接続状態を取得したい

Posted: 2013年12月26日(木) 09:44
by だんごさん
h2so5 さんが書きました:オンライン状態の基準を明確にしないと判断しようがないと思います。
説明不足で申し訳ないです。
たとえばブラウザを開いて(相手のサーバーがどうであれ)、とりあえずどれかには繋がったという情報が欲しいです。あるサイトだけが何か制限で引っかかって繋がらなくとも、別のサイトが開けたら「繋がっている」としたいのです。
要するに外部に接続できるかということです。(接続できる環境かどうかではない)
説明が下手で申し訳ない…

Re: インターネットの接続状態を取得したい

Posted: 2013年12月26日(木) 11:11
by softya(ソフト屋)
h2so5さんの言われるように片っぱしから大手サイトにアクセスを掛けてみるしか無いです。
2つ、3つ試してダメなら、ほぼダメだと断定して良いと思いますけど。

Re: インターネットの接続状態を取得したい

Posted: 2013年12月26日(木) 13:12
by みけCAT
環境によっては80番ポートと443番ポートが塞がれているけど、8080番ポートは使える、ということもあるので、
そのようなケースも考えないといけないかもしれません。

Re: インターネットの接続状態を取得したい

Posted: 2013年12月26日(木) 19:46
by zeek
InternetCheckConnection() はどうでしょうか?
ちなみに Google へのアクセスで確認してみると

コード:

BOOL IsInetCnnect(void)
{
    return InternetCheckConnection(L"https://www.google.co.jp/", FLAG_ICC_FORCE_CONNECTION, 0);
}
これで、こちらでは正しく動作しています。

Re: インターネットの接続状態を取得したい

Posted: 2013年12月26日(木) 21:22
by だんごさん
softya(ソフト屋) さんが書きました:h2so5さんの言われるように片っぱしから大手サイトにアクセスを掛けてみるしか無いです。
そうですか・・・
みけCAT さんが書きました:環境によっては80番ポートと443番ポートが塞がれているけど、8080番ポートは使える、ということもあるので、
そのようなケースも考えないといけないかもしれません。
なるほど。参考にします
zeek さんが書きました:InternetCheckConnection() はどうでしょうか?
だんごさん さんが書きました:InternetCheckConnectionは接続できないときに一時フリーズする致命的なことが起こるので使えません。

Re: インターネットの接続状態を取得したい

Posted: 2013年12月26日(木) 21:28
by softya(ソフト屋)
基本的にGUIの応答必要速度より遅い存在であるインターネットは、マルチスレッドにするなどしてGUIから分離するのが定番です。
.NET系の関数は詳しくないですが、非同期の動作モードを持つものがあればタイマと組み合わせれば良いかもしれません。
ない場合は、winsockを使うことを検討された方が良いのでは?

Re: インターネットの接続状態を取得したい

Posted: 2013年12月26日(木) 21:49
by だんごさん
softya(ソフト屋) さんが書きました:ない場合は、winsockを使うことを検討された方が良いのでは?
winsockでどこかのサイトにつながるかを試すということですね、考えてみます。


画像
上の画像の「インターネット」から「このコンピューター」までの間が繋がっているかそうでないかを調べたいだけなんですが…。この共有センターはどうやって取得しているんでしょうか?

Re: インターネットの接続状態を取得したい

Posted: 2013年12月26日(木) 23:31
by softya(ソフト屋)
私は調べたこと無いので分かりませんが、tracert の仕組みのようなものを途中まで使っているとか、DNSに接続されていればインターネットに接続しているとみなしているとかじゃないでしょうか。勘ですので外れている可能性も高いですよ。h2so5さんの方が詳しいと思います。
「tracert / traceroute の仕組み TCP/IP入門」
http://atnetwork.info/tcpip/tcpip89.html

【補足】
winsockとかだとウィンドウメッセージで非同期処理できるのでタイマとか必要ないですね。誤解を招くので訂正させていただきます。

Re: インターネットの接続状態を取得したい

Posted: 2013年12月27日(金) 00:26
by h2so5
だんごさん さんが書きました: 画像
上の画像の「インターネット」から「このコンピューター」までの間が繋がっているかそうでないかを調べたいだけなんですが…。この共有センターはどうやって取得しているんでしょうか?
僕の環境でWireSharkを使ってパケットをキャプチャしてみたところ、ルーターに対してUPnPでグローバルIPアドレスが有効かどうかを尋ねていました。(応答が帰ってきた瞬間に共有センター上での表示が変わったので判断基準の一つになっていると思われます)

ただ、UPnPはどの環境でも使えるわけではないのでDNSサーバから応答があるかどうか等もチェックしていると思います。

他にはログインが必要な公衆無線LANを検出するために、マイクロソフトのサーバか何かにHTTPで接続できるかどうかも裏でチェックしているはずですが、共有センターの表示とは関係がないでしょう。

Re: インターネットの接続状態を取得したい

Posted: 2013年12月27日(金) 16:08
by だんごさん
h2so5 さんが書きました:僕の環境でWireSharkを使ってパケットをキャプチャしてみたところ、ルーターに対してUPnPでグローバルIPアドレスが有効かどうかを尋ねていました。(応答が帰ってきた瞬間に共有センター上での表示が変わったので判断基準の一つになっていると思われます)
わざわざ調べていただきありがとうございます。UPnPについてはあまり詳しくないので、調べてみたいと思います。

色々と試してみましたが、結局取得できなかったり関数が対応していなかったりと、どれもうまくいきませんでした。
なのでwinsockを使いたいと思います。
ご返答ありがとうございました。