#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-это самое простое решение.