Как вы определяете, доступно ли подключение к Интернету для вашего приложения WinForms?

Каков наилучший способ определить, есть ли доступное подключение к Интернету для приложения WinForms. (Программно, конечно) Я хочу отключить/скрыть определенные функции, если пользователь не подключен к Интернету.

Ответы

Ответ 1

Ниже будет указано, если вы подключены к сети, однако это не обязательно означает, что вы подключены к Интернету:

NetworkInterface.GetIsNetworkAvailable() 

Вот С# перевод кода Стива, который кажется довольно хорошим:

private static int ERROR_SUCCESS = 0;
public static bool IsInternetConnected() {
    long dwConnectionFlags = 0;
    if (!InternetGetConnectedState(dwConnectionFlags, 0))
        return false;

    if(InternetAttemptConnect(0) != ERROR_SUCCESS)
        return false;

    return true;
}


 [DllImport("wininet.dll", SetLastError=true)]
 public static extern int InternetAttemptConnect(uint res);


 [DllImport("wininet.dll", SetLastError=true)]
 public static extern bool InternetGetConnectedState(long flags,long reserved); 

Ответ 2

Ответ sbeskur имеет ошибку при переводе InternetGetConnectedState. Параметрами являются как DWORD (первый - это LPDWORD). Оба они переводят на int в С# (технически, uint, но int будет работать для большинства сценариев).

Правильный перевод ниже.


[DllImport("wininet.dll", SetLastError=true)] 
public static extern bool InternetGetConnectedState(out int flags,int reserved);

Ответ 3

Я не разработчик С#, но на С++ вы можете использовать Win32 API (в частности, из Wininet.dll) следующим образом:

bool IsInternetConnected( void )
{
    DWORD dwConnectionFlags = 0;

    if( !InternetGetConnectedState( &dwConnectionFlags, 0 ) )
        return false;

    if( InternetAttemptConnect( 0 ) != ERROR_SUCCESS )
        return false;

    return true;
}

Я предполагаю, что это тривиально превращается в С#

Ответ 4

Я нашел этот код в другом месте, но действительно хочу знать, есть ли лучший способ.

HttpWebRequest req;
HttpWebResponse resp;
try
{
    req = (HttpWebRequest)WebRequest.Create("http://www.google.com");
    resp = (HttpWebResponse)req.GetResponse();

    if(resp.StatusCode.ToString().Equals("OK"))
    {
        Console.WriteLine("its connected.");
    }
    else
    {
        Console.WriteLine("its not connected.");
    }
}
catch(Exception exc)
{
    Console.WriteLine("its not connected.");
}

Мне нравится идея отслеживать, не потеряно ли соединение через событие NetworkChange, которое вызывается NetworkInterface. Мое приложение предназначено для использования неопытными пользователями, на ноутбуках, где интернет-соединение неустойчиво (часто в австралийском Outback).

Ответ 5

Догадка о подключении к Интернету была бы доступностью сети, NetworkInterface.GetIsNetworkAvailable(). События на NetworkChange могут сообщать вам, когда они меняются. Оба класса находятся в пространстве имен System.Net.NetworkInformation.

Конечно, вы не узнаете, действительно ли Интернет доступен, пока вы не попытаетесь связаться с чем-то.

Ответ 6

Состояние InternetGetConnected является первым шагом в установлении того, что вы подключены к сети. Чтобы определить, есть ли у вас интернет-соединение, один из методов заключается в использовании IPHelper api для отправки запроса ARP (протокол разрешения адресов) для некоторых сервер в Интернете.

Ответ 7

Ping google.com(или список известных хостов) или попробуйте выполнить одну из функций (в структурном смысле), для которой ваше приложение требует подключения к Интернету. В какой-либо операционной системе нет способа по-настоящему определить, функционирует ли подключение к Интернету, даже не пытаясь обмениваться информацией, в отличие от представления операционной системы о том, что представляет собой "доступный".

Ответ 8

http://www.csharphelp.com/archives3/archive499.html

Кроме того, прокрутите страницы обмена экспертами по адресу: http://www.csharpfriends.com/Forums/ShowPost.aspx?PostID=13045, и вы увидите некоторые предложения.

Кроме того, если вы играете для пространства имен My из VB.Net(к которому вы можете подключиться, btw), My.Computer.Network.IsAvailable - самое простое решение.