Подтвердить что ты не робот

Проверьте, доступно ли подключение к Интернету с помощью С#

Каков самый простой способ проверить, доступно ли интернет-соединение программно?

EDIT: Как я предложил, я попытался использовать следующий метод, но он всегда возвращает 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();
}
}

Дополнительная информация (если это помогает): я получаю доступ к интернету через общую сеть Wi-Fi.

4b9b3361

Ответ 1

Здесь - это Windows API, на который вы можете позвонить. Это в wininet.dll и называется 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 ) ;
    }
}

Ответ 2

Microsoft vista Vista и 7 используют NCSI (индикатор состояния сетевого подключения):

NCSI выполняет поиск DNS на www.msftncsi.com, затем запрашивает http://www.msftncsi.com/ncsi.txt. Этот файл является текстовым файлом и содержит только текст "Microsoft NCSI". NCSI отправляет запрос поиска DNS для dns.msftncsi.com. Этот DNS-адрес должен быть разрешен до 131.107.255.255. Если адрес не совпадает, тогда предполагается, что интернет-соединение работает неправильно.

Ответ 3

Вы можете проверить сетевое подключение, используя это в .NET 2.0 +

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

Это, скорее всего, вернет true для локальных сетей, поэтому может не сработать для вас.

Ответ 4

вот лучшее решение, которое я нашел до сих пор:

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
}

Ответ 5

Это вопрос, когда ответ действительно "зависит". Потому что это зависит от того, почему вы хотите проверить и для какой связи? Вы хотите иметь доступ к определенным веб-сайтам или услугам через http? Отправить smtp-почту? Поиск dns?

Использование комбинации предыдущих ответов - это, вероятно, путь: сначала используйте wininet api из colitium answer, чтобы проверить, доступно ли соединение любого типа.

Если это так, попробуйте несколько поисков dns (см. System.Net.Dns) для интересующих вас ресурсов или для некоторых популярных крупных сайтов (google, altavista, compuserve и т.д.).

Затем вы можете попробовать выполнить ping (см. ответ Roger Willcocks) и/или установить подключение сокета к тем же сайтам. Обратите внимание, что неудачный ping может означать, что правила брандмауэра не позволяют вам пинговать.

Если вы можете уточнить, почему вы хотите проверить, будет проще предоставить ответ, который будет отвечать вашим требованиям...

Ответ 6

Самый простой способ - проверить, могут ли они загрузить файл из Интернета, который, как вам известно, доступен. Используйте следующий код, чтобы загрузить домашнюю страницу google.

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

Вероятно, вы должны обернуть это в Try... Catch, чтобы поймать исключение, которое вызывается, когда оно не может установить соединение.

Ответ 8

Есть и другие варианты.

Библиотека InfoPath предоставляет метод "IsDestinationReachable" , который является оберткой для метода Win API с тем же именем. (Похоже, Vista не поддерживает его)

Однако, я считаю, что из Документов это зависит от чего-то вроде PING, поэтому не обязательно хороший тест.

Vista + используйте "Network List Manager"

@colithium Google не может быть недоступен, но также может произойти сбой, если интервал lokup DNS превышает таймаут. Не редкость дома здесь, в Новой Зеландии, первая попытка не выполняется, вторая - неудача, потому что данные передаются обратно на DNS-сервер ISP или ваш кэш маршрутизатора к моменту завершения второго запроса.

Ответ 9

В качестве альтернативы вы можете использовать поиск DNS для проверки подключения к Интернету. Этот метод работает быстрее, чем метод Ping.

public static bool DnsTest()
    {
        try
        {
            System.Net.IPHostEntry ipHe =
                System.Net.Dns.GetHostByName("www.google.com");
            return true;
        }
        catch
        {
            return false;
        }
    }