Как вы определяете, доступно ли подключение к Интернету для вашего приложения 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 - самое простое решение.