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

#c# #.net #winforms

Вопрос:

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

Ответ №1:

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

 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); 
 

Ответ №2:

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

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

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

Ответ №3:

Я не разработчик c#, но в C вы можете использовать Win32 API (в частности, из Wininet.dll) вот так:

 bool IsInternetConnected( void )
{
    DWORD dwConnectionFlags = 0;

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

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

    return true;
}
 

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

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

Ответ №5:

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

Комментарии:

1. Помимо того факта, что не все подключены к сети Ethernet, вы не можете отправлять запросы ARP за пределы вашего собственного широковещательного домена. В лучшем случае пограничный шлюз ответит на ваш запрос своим собственным MAC-адресом, что вам ничего не даст.

2. Поправьте меня, если я ошибаюсь, но если я завишу от пинга, то я рискую, что либо брандмауэр, либо сервер, на который я обращаюсь, будут фильтровать пинги. С другой стороны, если я arp_request(google.com) и я получаю правильный ответ, тогда я знаю, что могу выйти в сеть. Для этой цели это все, что нам нужно.

Ответ №6:

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

Ответ №7:

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

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

Ответ №8:

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

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

Кроме того, если вы играете за пространство имен My из VB.Net (кстати, на который вы можете ссылаться), Мой компьютер.Сеть.isAvailable-это самое простое решение.