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

set bit=64
IF NOT DEFINED PROGRAMFILES(X86) (
set "PROGRAMFILES(X86)=%PROGRAMFILES%"
set bit=32
)
REM Example 1: REG IMPORT Install%bit%.reg (all compatibility)
REM Example 2: CD %PROGRAMFILES(X86)% (all compatibility)
13
задан ICR 12 October 2008 в 12:15
поделиться

8 ответов

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

NetworkInterface.GetIsNetworkAvailable() 

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

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); 
15
ответ дан sbeskur 12 October 2008 в 12:15
поделиться

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

bool IsInternetConnected( void )
{
    DWORD dwConnectionFlags = 0;

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

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

    return true;
}

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

9
ответ дан QAZ 12 October 2008 в 12:15
поделиться
  • 1
    Попробуйте следующую ссылку, которая предоставляет ориентированное на многопотоковое исполнение решение, которое работает от любого потока и может быть связано с через несколько потоков UI: codeproject.com/Articles/64936/… – Anthony 15 April 2014 в 19:20

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

Корректный перевод ниже.


[DllImport("wininet.dll", SetLastError=true)] 
public static extern bool InternetGetConnectedState(out int flags,int reserved);
10
ответ дан JaredPar 12 October 2008 в 12:15
поделиться
  • 1
    Лично я не смог сделать его работами с предоставленными ссылками. Мне был нужен пользователю JaredPas' подход Вы упомянули. – Krzysztof Morcinek 3 March 2014 в 12:48

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

1
ответ дан Jim In Texas 12 October 2008 в 12:15
поделиться

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

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

2
ответ дан Stuart Helwig 12 October 2008 в 12:15
поделиться

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

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

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

0
ответ дан torial 12 October 2008 в 12:15
поделиться
  • 1
    Спасибо за Ваш ответ. Я посмотрю на это завтра, поскольку это - 1:30 здесь. – ErikTJ 19 February 2010 в 00:32

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

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

1
ответ дан Druid 12 October 2008 в 12:15
поделиться
  • 1
    @Reed, добавило решение с SynchronizationContext, который имеет функциональную разновидность. – JaredPar 19 February 2010 в 00:28

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

1
ответ дан Mihai Limbășan 12 October 2008 в 12:15
поделиться
  • 1
    +1: Кроме того, тот же подход может быть сделан с помощью SynchronizationContext. Текущий вместо диспетчера, если Вы don' t хотят взять зависимость WPF (т.е.: Вы хотите также использовать этот код в Windows Forms). – Reed Copsey 19 February 2010 в 00:21
Другие вопросы по тегам:

Похожие вопросы: