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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
だんごさん
記事: 273
登録日時: 13年前

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

#1

投稿記事 by だんごさん » 11年前

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

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

Windows7
C言語
VC++2010E
 Dango San

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

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

#2

投稿記事 by h2so5 » 11年前

具体的にどのような状況を「インターネットに接続できる」と考えているのでしょうか。

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

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

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

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

だんごさん
記事: 273
登録日時: 13年前

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

#3

投稿記事 by だんごさん » 11年前

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#4

投稿記事 by softya(ソフト屋) » 11年前

h2so5さんの言われるように片っぱしから大手サイトにアクセスを掛けてみるしか無いです。
2つ、3つ試してダメなら、ほぼダメだと断定して良いと思いますけど。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

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

#5

投稿記事 by みけCAT » 11年前

環境によっては80番ポートと443番ポートが塞がれているけど、8080番ポートは使える、ということもあるので、
そのようなケースも考えないといけないかもしれません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

zeek

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

#6

投稿記事 by zeek » 11年前

InternetCheckConnection() はどうでしょうか?
ちなみに Google へのアクセスで確認してみると

コード:

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

だんごさん
記事: 273
登録日時: 13年前

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

#7

投稿記事 by だんごさん » 11年前

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#8

投稿記事 by softya(ソフト屋) » 11年前

基本的にGUIの応答必要速度より遅い存在であるインターネットは、マルチスレッドにするなどしてGUIから分離するのが定番です。
.NET系の関数は詳しくないですが、非同期の動作モードを持つものがあればタイマと組み合わせれば良いかもしれません。
ない場合は、winsockを使うことを検討された方が良いのでは?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

だんごさん
記事: 273
登録日時: 13年前

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

#9

投稿記事 by だんごさん » 11年前

softya(ソフト屋) さんが書きました:ない場合は、winsockを使うことを検討された方が良いのでは?
winsockでどこかのサイトにつながるかを試すということですね、考えてみます。


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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#10

投稿記事 by softya(ソフト屋) » 11年前

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

【補足】
winsockとかだとウィンドウメッセージで非同期処理できるのでタイマとか必要ないですね。誤解を招くので訂正させていただきます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

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

#11

投稿記事 by h2so5 » 11年前

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

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

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

だんごさん
記事: 273
登録日時: 13年前

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

#12

投稿記事 by だんごさん » 11年前

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

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

閉鎖

“C言語何でも質問掲示板” へ戻る