Всем привет, возник вопрос по проверке подключения к интернет, ребята посоветуйте пожалуйста как лучше, буду очень благодарен!
В моей программе(winforms net 2.0) стоит задача периодически проверять подключение к интернет. Я бы не хотел использовать многопоточную модель и в моей программе алгоритмы в основном работают в синхронном режиме.
Сначала для проверки интернет я попробовал использовать функции WinInet InternetGetCconnectedState и InternetCheckConnection. Первая функция в ряде случаев выдавала положительный результат при отсутствии интернет, а вторая функция в случаях, когда невозможно разрешить адрес интернет-хоста по имени, замораживала основной поток программы до истечения тайм-аута.
Я написал функцию, которая ждет разрешение адреса или ответ от тестового сервера, какое-то фиксированное количество времени.
static Ping ping = new Ping();
public static bool IsInternetConnectionAvailable()
{
try
{
IAsyncResult ares = Dns.BeginGetHostEntry("sdfsdfsdfsdfsdfsdf", null, null);
DateTime endWait = DateTime.Now.AddMilliseconds(1000);
while (DateTime.Now < endWait && ares.IsCompleted == false) Thread.Sleep(0);
int elapsedTimeout = (int)endWait.Subtract(DateTime.Now).TotalMilliseconds;
if (ares.IsCompleted && elapsedTimeout > 0)
{
IPHostEntry _h = Dns.EndGetHostEntry(ares);
foreach (IPAddress address in _h.AddressList)
{
PingReply reply = ping.Send(address, elapsedTimeout);
if (reply.Status == IPStatus.Success) return true;
if ((elapsedTimeout -= (int)reply.RoundtripTime) <= 0) break;
}
}
}
catch (Exception ex)
{
Debug.Fail("Ошибка при проверке подключения к интернет: " + Environment.NewLine + ex.Message);
}
return false;
}
Эта функция вроде работает, но скажите пожалуйста, будет ли она работать надежно? Как я понимаю вызов Dns.BeginGetHostEntry создает новый поток в приложении, который, если я не ошибаюсь, может работать секунд 20 или 30 или сколько длится таймаут неудачного разрешения ip адреса. Я сымитировал ситуацию, когда адрес хоста невозможно получить по имени и попробовал вызвать эту функцию несколько раз в течение короткого промежутка времени и visual studio показала, что в программе появилось несколько потоков. Также я попробовал вызывать эту функцию много раз, количество дополнительных потоков не превысило восьми-десяти(кажется), но никаких ексепшнов в функции не возникло и функция честно выдавала ответ о недоступности хоста.
Пока писал я подумал о том, что неплохо бы , чтобы в интернете был какой-нибудь хост с неизменным IP и который бы отвечал всегда на пинг или имел всегда открытый 80 порт. Тогда мне кажется моя задача упростилась и мне нужно было бы разрешать имя в асинхронном режиме. Такое возможно?