インターネットの接続状態を取得したい
インターネットの接続状態を取得したい
windowsでインターネットに接続できるかを取得したいだけなのに調べてみると良い方法が出てこずに困っています。
まず、InternetAttemptConnectは「接続環境」を調べるので使えず、InternetCheckConnectionは接続できないときに一時フリーズする致命的なことが起こるので使えません。(マルチスレッドはアプリの仕様上避けたいです)
InternetGetConnectedStateは引数の使い方がいまいち分からず正しく取得できない(戻り値も正しくない)、またキャッシュを使っているのか環境によって反映までが長かったりするらしく、使い勝手が悪かったです。(自分のせいでもありますが…)
他にいい方法、もしくは取得できるならInternetGetConnectedStateの使い方を教えていただけないでしょうか?
よろしくお願いいたします。
Windows7
C言語
VC++2010E
まず、InternetAttemptConnectは「接続環境」を調べるので使えず、InternetCheckConnectionは接続できないときに一時フリーズする致命的なことが起こるので使えません。(マルチスレッドはアプリの仕様上避けたいです)
InternetGetConnectedStateは引数の使い方がいまいち分からず正しく取得できない(戻り値も正しくない)、またキャッシュを使っているのか環境によって反映までが長かったりするらしく、使い勝手が悪かったです。(自分のせいでもありますが…)
他にいい方法、もしくは取得できるならInternetGetConnectedStateの使い方を教えていただけないでしょうか?
よろしくお願いいたします。
Windows7
C言語
VC++2010E
Dango San
Re: インターネットの接続状態を取得したい
具体的にどのような状況を「インターネットに接続できる」と考えているのでしょうか。
例えばGoogleを利用できるかどうかは、実際にgoogle.comに接続してみないと分かりません。
こちらの環境に問題がなくても、向こうのサーバーに問題があるかもしれないからです。
Googleを利用するアプリケーションにとって、yahoo.comに接続できるがgoogle.comに接続できないような状況は、
インターネット接続が利用できないのと同じことです。
google.comのような外部のサーバーにHTTPで接続できても、ポートが制限されていてFTP接続ができない環境もあります。
その場合はFTPを使うアプリケーションにとっては、インターネット接続が利用できないのと同じことです。
オンライン状態の基準を明確にしないと判断しようがないと思います。
例えばGoogleを利用できるかどうかは、実際にgoogle.comに接続してみないと分かりません。
こちらの環境に問題がなくても、向こうのサーバーに問題があるかもしれないからです。
Googleを利用するアプリケーションにとって、yahoo.comに接続できるがgoogle.comに接続できないような状況は、
インターネット接続が利用できないのと同じことです。
google.comのような外部のサーバーにHTTPで接続できても、ポートが制限されていてFTP接続ができない環境もあります。
その場合はFTPを使うアプリケーションにとっては、インターネット接続が利用できないのと同じことです。
オンライン状態の基準を明確にしないと判断しようがないと思います。
Re: インターネットの接続状態を取得したい
説明不足で申し訳ないです。h2so5 さんが書きました:オンライン状態の基準を明確にしないと判断しようがないと思います。
たとえばブラウザを開いて(相手のサーバーがどうであれ)、とりあえずどれかには繋がったという情報が欲しいです。あるサイトだけが何か制限で引っかかって繋がらなくとも、別のサイトが開けたら「繋がっている」としたいのです。
要するに外部に接続できるかということです。(接続できる環境かどうかではない)
説明が下手で申し訳ない…
Dango San
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: インターネットの接続状態を取得したい
h2so5さんの言われるように片っぱしから大手サイトにアクセスを掛けてみるしか無いです。
2つ、3つ試してダメなら、ほぼダメだと断定して良いと思いますけど。
2つ、3つ試してダメなら、ほぼダメだと断定して良いと思いますけど。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: インターネットの接続状態を取得したい
環境によっては80番ポートと443番ポートが塞がれているけど、8080番ポートは使える、ということもあるので、
そのようなケースも考えないといけないかもしれません。
そのようなケースも考えないといけないかもしれません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: インターネットの接続状態を取得したい
そうですか・・・softya(ソフト屋) さんが書きました:h2so5さんの言われるように片っぱしから大手サイトにアクセスを掛けてみるしか無いです。
なるほど。参考にしますみけCAT さんが書きました:環境によっては80番ポートと443番ポートが塞がれているけど、8080番ポートは使える、ということもあるので、
そのようなケースも考えないといけないかもしれません。
zeek さんが書きました:InternetCheckConnection() はどうでしょうか?
だんごさん さんが書きました:InternetCheckConnectionは接続できないときに一時フリーズする致命的なことが起こるので使えません。
Dango San
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: インターネットの接続状態を取得したい
基本的にGUIの応答必要速度より遅い存在であるインターネットは、マルチスレッドにするなどしてGUIから分離するのが定番です。
.NET系の関数は詳しくないですが、非同期の動作モードを持つものがあればタイマと組み合わせれば良いかもしれません。
ない場合は、winsockを使うことを検討された方が良いのでは?
.NET系の関数は詳しくないですが、非同期の動作モードを持つものがあればタイマと組み合わせれば良いかもしれません。
ない場合は、winsockを使うことを検討された方が良いのでは?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: インターネットの接続状態を取得したい
winsockでどこかのサイトにつながるかを試すということですね、考えてみます。softya(ソフト屋) さんが書きました:ない場合は、winsockを使うことを検討された方が良いのでは?

上の画像の「インターネット」から「このコンピューター」までの間が繋がっているかそうでないかを調べたいだけなんですが…。この共有センターはどうやって取得しているんでしょうか?
Dango San
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: インターネットの接続状態を取得したい
私は調べたこと無いので分かりませんが、tracert の仕組みのようなものを途中まで使っているとか、DNSに接続されていればインターネットに接続しているとみなしているとかじゃないでしょうか。勘ですので外れている可能性も高いですよ。h2so5さんの方が詳しいと思います。
「tracert / traceroute の仕組み TCP/IP入門」
http://atnetwork.info/tcpip/tcpip89.html
【補足】
winsockとかだとウィンドウメッセージで非同期処理できるのでタイマとか必要ないですね。誤解を招くので訂正させていただきます。
「tracert / traceroute の仕組み TCP/IP入門」
http://atnetwork.info/tcpip/tcpip89.html
【補足】
winsockとかだとウィンドウメッセージで非同期処理できるのでタイマとか必要ないですね。誤解を招くので訂正させていただきます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: インターネットの接続状態を取得したい
僕の環境でWireSharkを使ってパケットをキャプチャしてみたところ、ルーターに対してUPnPでグローバルIPアドレスが有効かどうかを尋ねていました。(応答が帰ってきた瞬間に共有センター上での表示が変わったので判断基準の一つになっていると思われます)だんごさん さんが書きました:
上の画像の「インターネット」から「このコンピューター」までの間が繋がっているかそうでないかを調べたいだけなんですが…。この共有センターはどうやって取得しているんでしょうか?
ただ、UPnPはどの環境でも使えるわけではないのでDNSサーバから応答があるかどうか等もチェックしていると思います。
他にはログインが必要な公衆無線LANを検出するために、マイクロソフトのサーバか何かにHTTPで接続できるかどうかも裏でチェックしているはずですが、共有センターの表示とは関係がないでしょう。
Re: インターネットの接続状態を取得したい
わざわざ調べていただきありがとうございます。UPnPについてはあまり詳しくないので、調べてみたいと思います。h2so5 さんが書きました:僕の環境でWireSharkを使ってパケットをキャプチャしてみたところ、ルーターに対してUPnPでグローバルIPアドレスが有効かどうかを尋ねていました。(応答が帰ってきた瞬間に共有センター上での表示が変わったので判断基準の一つになっていると思われます)
色々と試してみましたが、結局取得できなかったり関数が対応していなかったりと、どれもうまくいきませんでした。
なのでwinsockを使いたいと思います。
ご返答ありがとうございました。
Dango San