26

インターネット接続がプログラムで利用可能かどうかを確認する最も簡単な方法は何ですか?

編集:提案されたように、私は次のメソッドを使用しようとしましたが、それは常にtrueを返します。

[Flags]
enum InternetConnectionState : int
{
    INTERNET_CONNECTION_MODEM = 0x1,
    INTERNET_CONNECTION_LAN = 0x2,
    INTERNET_CONNECTION_PROXY = 0x4,
    INTERNET_RAS_INSTALLED = 0x10,
    INTERNET_CONNECTION_OFFLINE = 0x20,
    INTERNET_CONNECTION_CONFIGURED = 0x40
}

class Program
{
    [DllImport("WININET", CharSet = CharSet.Auto)]
    static extern bool InternetGetConnectedState(ref InternetConnectionState lpdwFlags, int dwReserved);

static void Main(string[] args)
{
    InternetConnectionState flags = 0;
    bool isConnected = InternetGetConnectedState(ref flags, 0);
    Console.WriteLine(isConnected);
    //Console.WriteLine(flags);
    Console.ReadKey();
}
}

追加情報(役立つ場合):共有wifiネットワーク経由でインターネットにアクセスします。

4

9 に答える 9

21

Here is the Windows API you can call into. It's in wininet.dll and called InternetGetConnectedState.

using System;
using System.Runtime;
using System.Runtime.InteropServices;

public class InternetCS
{
    //Creating the extern function...
    [DllImport("wininet.dll")]
    private extern static bool InternetGetConnectedState( out int Description, int ReservedValue );

    //Creating a function that uses the API function...
    public static bool IsConnectedToInternet( )
    {
        int Desc ;
        return InternetGetConnectedState( out Desc, 0 ) ;
    }
}
于 2009-07-05T23:24:48.090 に答える
10

Microsoft Windows Vista および 7 は NCSI (Network Connectivity Status Indicator) 技術を使用します。

NCSI は、www.msftncsi.com で DNS ルックアップを実行し、次にhttp://www.msftncsi.com/ncsi.txtを要求します。このファイルはプレーンテキスト ファイルで、「Microsoft NCSI」というテキストのみが含まれています。NCSI は、dns.msftncsi.com の DNS 参照要求を送信します。この DNS アドレスは 131.107.255.255 に解決されます。アドレスが一致しない場合は、インターネット接続が正しく機能していないと見なされます。

于 2012-01-09T15:07:48.063 に答える
8

これが私がこれまでに見つけた最良の解決策です:

public static bool isConnected()
    {
        try
        {
            string myAddress = "www.google.com";
            IPAddress[] addresslist = Dns.GetHostAddresses(myAddress);

            if (addresslist[0].ToString().Length > 6)
            {
                return true;
            }
            else
                return false;

        }
        catch
        {
            return false;
        }

    }

利用方法:

if(isConnected())
{
    //im connected to the internet
}
else
{
    //not connected
}
于 2011-09-23T06:24:35.177 に答える
7

.NET2.0以降でこれを使用してネットワーク接続を確認できます

System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable();

これはおそらくtrueローカルネットワークに戻るだけなので、うまくいかない場合があります。

于 2009-07-05T23:29:56.443 に答える
6

これは、答えが実際には「場合による」という質問です。チェックする理由と接続の種類によって異なります。http 経由で特定の Web サイトやサービスにアクセスできるようにしたいですか? SMTP メールを送信しますか? DNSルックアップを行いますか?

以前の回答を組み合わせて使用​​ することがおそらく道です.colithiumの回答からwininet apiを使用して、何らかの接続が利用可能かどうかを確認してください。

そうである場合は、関心のあるリソースまたはいくつかの人気のある大きな Web サイト (google、altavista、compuserve など) に対して、いくつかの dns ルックアップ ( System.Net.Dns を参照) を試してください。

次に、ping (Roger Willcocks の回答を参照) および/または同じサイトへのソケット接続の確立を試すことができます。ping の失敗は、ファイアウォール ルールによって ping が許可されていないことを意味している可能性があることに注意してください。

なぜチェックしたいのかをより具体的にすることができれば、あなたの要件をカバーする答えを提供するのがより簡単になります...

于 2009-07-06T03:35:50.350 に答える
4

最も簡単な方法は、おそらく、利用可能であることがわかっているWebからファイルをダウンロードできるかどうかを確認することです。次のコードを使用して、Googleのホームページをダウンロードします。

WebClient Client = new WebClient ();
String Response;
Response = Client.DownloadString("http://www.google.com");

おそらくそれをTry....Catchでラップして、接続を確立できないときにスローされる例外をキャッチする必要があります。

于 2009-07-05T23:25:17.013 に答える
2

Windows XP のネットワーク認識

Windows Vista および Windows 7 のネットワーク認識

もちろん、これは訪問しようとしている Web サイトが共同ファイアウォール ルールによってブロックされていないことを保証するものではありませ

于 2011-09-24T00:54:39.543 に答える
0

他にもいくつかのオプションがあります。

InfoPath ライブラリは、同じ名前の Win API メソッドのラッパーである"IsDestinationReachable"メソッドを公開します。(Vistaは対応していないようです)

ただし、Docs からは、PING などに依存していると思われるため、必ずしも良いテストではありません。

Vista + 「ネットワーク リスト マネージャー」を使用すると言う

@colithium Google はダウンしていない可能性がありますが、DNS ルックアップ間隔がタイムアウトを超えると失敗する可能性もあります。ここ NZ では珍しくありません。最初の試行は失敗し、2 番目の要求が完了するまでにデータが ISP DNS またはルーターのキャッシュに伝搬されているため、2 番目の試行は成功します。

于 2009-07-06T02:50:35.190 に答える