質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

1514閲覧

インターネットに接続できるかの確認方法について

kishidamisao

総合スコア13

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2023/03/28 08:11

インターネットに接続できるかどうかを以下のように確認していたのですが、ビュアルスタジオを最新にアップデートしたら例外が発生するようになった。
こちらに記載された方法を試したのですが修正できませんでした。
この症状は、厄介なことに何回かは、正確な判断が返ってくるのと
、このエラーがでると、インターネットにつながらなくなってしまいました。
ただし、ブラウザーではネットにつながりサイトも閲覧出来ました。
その為、この方法はやめようと考えてます。

そこで、他のインターネットに接続できるかの確認方法が知りたいのですが
PINGを使用して行うのが良いのでしょうか
どこかのサイトにアイクセスしてエラーが返ってくるか調べる等も
考えたのですが、どなたかこれなら確実に、接続できる方法
知っている方がいましたら教えてください。

例外の内容
詳細は以下になります。
System.IO.IOException
HResult=0x80131620
Message=Unable to read data from the transport connection: スレッドの終了またはアプリケーションの要求によって、I/O 処理は中止されました。.
Source=System.Net.Sockets
スタック トレース:
場所 System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.ThrowException(SocketError error, CancellationToken cancellationToken) (//src/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.Tasks.cs):行 1446
場所 System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.System.Threading.Tasks.Sources.IValueTaskSource<System.Int32>.GetResult(Int16 token) (/
/src/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.Tasks.cs):行 1346
場所 System.Net.Security.SslStream.<ReadAsyncInternal>d__159`1.MoveNext() (/_/src/libraries/System.Net.Security/src/System/Net/Security/SslStream.IO.cs):行 810

内部例外 1:
SocketException: スレッドの終了またはアプリケーションの要求によって、I/O 処理は中止されました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2023/03/28 09:16

> インターネットに接続できるかどうかを以下のように確認していたのですが、 「以下のように」とは?
kishidamisao

2023/03/28 09:39

すみません。 よく使用する以下の関数です。 if (System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()) { Console.WriteLine("ネットワークに接続れてます");   〕else { Console.WriteLine("ネットワークに接続されていません"); }  色々調べてみると以下のことがわかりました。 この関数は、2つの条件の内、一つが合っているとネットにつながっていると判断するようです。 1.ネットワークインターフェースが稼働していて (OperationalStatus.Up) 2.ネットワークインターフェースの種類がトンネル接続でもループバック (!NetworkInterfaceType.Tunnel & Loopback) でもない リソース https://referencesource.microsoft.com/#System/net/System/Net/NetworkInformation/SystemNetworkInterface.cs,ccae9d81632b908d
退会済みユーザー

退会済みユーザー

2023/03/28 12:43

上のことは質問欄を編集して追記してください。
guest

回答1

0

ベストアンサー

Windows は次のようにインターネット接続を確認しているようです。
https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/ee126135(v=ws.10)

(1) https://www.msftncsi.com/ncsi.txt あるいは https://ipv6.msftncsi.com/ncsi.txt を取得して、中身が "Microsoft NCSI" であること
(2) dns.msftncsi.com を名前解決した結果が 131.107.255.255、あるいは fd3e:4f5a:5b81::1 であること

#追記

「InternetGetConnectedState 関数」
https://learn.microsoft.com/ja-jp/windows/win32/api/winineti/nf-winineti-internetgetconnectedstate

を使っても良さそうですが、
「メモ この API の使用はお勧めしません。代わりに INetworkListManager::GetConnectivity メソッドを使用してください。」
とあるので

https://stackoverflow.com/questions/8027791/specific-network-interface-ipv4-availability-no-connectivity-local-internet

のようにするといいかもしれません。

投稿2023/03/28 09:13

編集2023/03/28 09:34
KOZ6.0

総合スコア2639

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kishidamisao

2023/03/29 00:26

とりあえず、 INetworkListManager::GetConnectivityを使用してみたいと考えます。 また、PINGの方が確実かなぁとも考えています。 ありがとうございました。
KOZ6.0

2023/03/29 09:31

プロキシ経由でのみインターネットに接続できるような環境では、ping は届きません。
kishidamisao

2023/03/30 01:53

了解しました。重ね重ねではありますが、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問