Как определить, доступно ли подключение к Интернету для вашего приложения WinForms? - PullRequest
13 голосов
/ 12 октября 2008

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

Ответы [ 8 ]

15 голосов
/ 12 октября 2008

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

NetworkInterface.GetIsNetworkAvailable() 

Вот перевод кода Стива на C #, который выглядит довольно неплохо:

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(out int flags,int reserved); 
10 голосов
/ 12 октября 2008

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

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


[DllImport("wininet.dll", SetLastError=true)] 
public static extern bool InternetGetConnectedState(out int flags,int reserved);
9 голосов
/ 12 октября 2008

Я не разработчик на C #, но в C ++ вы можете использовать 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;
}

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

2 голосов
/ 12 октября 2008

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

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. Мое приложение предназначено для неопытных пользователей на ноутбуках, где интернет-соединение нестабильно (часто в австралийской глубинке).

1 голос
/ 12 октября 2008

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

1 голос
/ 12 октября 2008

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

1 голос
/ 12 октября 2008

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

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

0 голосов
/ 12 октября 2008

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...