Страница: 1 | 2 | 3 |
Вопрос: Коннект к Интернет: избитая тема в новом ракурсе
Добавлено: 06.02.05 18:28
Автор вопроса: Comanche
Я насчитал аж 11 разных способов определения наличия коннекта к Инету. Но ни одного надёжного (по большому счёту). Или нужно как-то хитро "комбинировать" разные способы (что я и попытался предложить в упоминаемом ниже демо-проекте), или проверять "в лоб", пытаясь открыть внешний URL и определяя успешность такой попытки. Тоже не стопроцентная гарантия. Кроме того, способ хотелось бы найти не только надёжный, но и быстрый, чтобы регулярная проверка наличия коннекта не "подвешивала" приложение.
Ещё немного угнетает то, что даже на форумах самого Майкрософта какие-то "крутые" ребята подтверждают наличие данной проблемы и открыто говорят, что надёжнее способа "в лоб" - нет. Так себе утешение от Майкрософта, а?!
В общем, кому интересна проблема - предлагаю проверить разные способы коннекта под разными условиями: модемное соединение, модемное соединение с прокси, LAN-соединение, LAN-соединение с прокси, LAN-соединение с файрволлом. Имея в виду непрозрачные прокси, конечно. Под разными ОС, к тому же. Может быть, совместными усилиями мы, наконец, родим какую-нибудь оптимальную (и - что немаловажно - универсальную) логику проверки.
Для этих целей я сделал маленький демо-проектик. На единственной форме - возможность выполнить проверку 5-ю основными API-способами, и убедиться в достоверности полученного от API-функций результата. Кроме того, есть кнопка "Дополнительная информация...", которая покажет вам (просто покажет, в мессаджбоксе) ещё 6 вариантов проверки коннекта. И, наконец, есть кнопка "Так что же всё-таки выбрать?", которая покажет вам единственную логику, которая пришла мне в голову; там комбинация нескольких способов, и я ещё не проверял эту логику, если честно.
Ссылка для загрузки проекта:
http://formtoini.narod.ru/Downloads/CheckInternet.zip
Тема, с одной стороны, избитая. Но... лишь по частоте упоминания во всевозможных форумах. Максимум, до чего обычно все договариваются, - это всем известные "3 способа", выкладываемые в форумы в виде, опять-таки, "типового" проекта, уже набившего оскомину. Дальше этого ситуация обычно не сдвигается. Я уверен, что серьёзное и универсальное решение можно сделать, только учитывая массу факторов: прокси, файрволлы, версию ОС, и, возможно, применяя "статистический" подход (в пределах разумного, конечно). Но таких решений видеть не приходилось. М.б. это вообще невыполнимая задача?!
Ответы
Всего ответов: 36
Номер ответа: 1
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #1
Добавлено: 06.02.05 20:10
Это невыполнимая задача, поскольку любое действие, предпринимаемое тобой для проверки возможности осуществления чего-либо, кроме осуществления этого самого, может иметь разные правила с осуществлением это чего-либо. Так что способ "в лоб" действительно единственный и это не проблема, а очевидное ограничение.
Номер ответа: 2
Автор ответа:
Comanche
Вопросов: 87
Ответов: 459
Профиль | | #2
Добавлено: 06.02.05 22:05
Я не прошу общих рассуждений об осуществимости/неосуществимости ИДЕАЛЬНОГО способа, - я прошу помочь в нахождении ОПТИМАЛЬНОГО варианта, который - естественно - не будет совпадать с идеальным. Но - максимально приблизит к решению проблемы.
Номер ответа: 3
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #3
Добавлено: 06.02.05 22:16
В лоб
Номер ответа: 4
Автор ответа:
Comanche
Вопросов: 87
Ответов: 459
Профиль | | #4
Добавлено: 06.02.05 22:32
Ты утверждаешь это со знанием данной проблемы - или "понаслышке"?
Кто-нибудь вообще серьёзно озадачивался этим вопросом?!
Номер ответа: 5
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #5
Добавлено: 06.02.05 22:59
Лично я собрал способы в отдельные dll библиотеки и предложил пользователю самому выбирать что лучше работает...
Номер ответа: 6
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #6
Добавлено: 07.02.05 00:37
Я всегда выбирал вариант "в лоб" и считаю это не только самым правильным, но и самым простым и верным решением.
Номер ответа: 7
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #7
Добавлено: 07.02.05 00:41
Угу, забыл еще сказать про быстрое
Номер ответа: 8
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #8
Добавлено: 07.02.05 00:48
Для быстроты можно выполнять только часть проверки "в лоб", например, если надо получить какой-то файл по HTTP, то проверить можно, послав запрос с Range и запросить только пару байт
Номер ответа: 9
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #9
Добавлено: 07.02.05 01:26
гы... это все равно не способ с плохой связью - реакция секунды три!
Номер ответа: 10
Автор ответа:
Comanche
Вопросов: 87
Ответов: 459
Профиль | | #10
Добавлено: 07.02.05 01:54
Так, одно интересное предложение уже имеем!
Я пошёл по похожему пути, определяя, как именно пользователь коннектится - через модем или же через LAN: сделал в настройках чекбокс "Я подключаюсь к Сети Интернет при помощи модема" (который, разумеется, нельзя взвести, если нет RAS-соединений). Ведь не факт, что юзер коннектится через модем, даже если RAS установлен и имеются RAS-соединения... пусть уж лучше галочку сам ставит )
Хотя это, конечно, от безысходности.
Номер ответа: 11
Автор ответа:
Comanche
Вопросов: 87
Ответов: 459
Профиль | | #11
Добавлено: 07.02.05 02:00
Кстати, насчёт торможения и "трёх секунд":
Не столько плохи эти 3 секунды, сколько то, что приложение тормозит во время них. Это сразу видно по торможению всяких GUI-шных вещей - отрисовке сложных контролов, "рваной" реакции на мышиные события и т.п.
Я даже выносил "проверяльщика" в отдельный EXE, который общался с основным проектом посредством DDE. Но временно отказался от этого варианта: вдруг что покрасивше получится придумать.
Номер ответа: 12
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #12
Добавлено: 07.02.05 02:11
Попробуй воспользоваться асинхронным режимом получения данных... если интересует могу выслать я тут класс когда-то делал...
Но все равно, имхо, оно криво...
Номер ответа: 13
Автор ответа:
Comanche
Вопросов: 87
Ответов: 459
Профиль | | #13
Добавлено: 07.02.05 13:40
Was ist Das - "асинхронный режим получения данных"? просто callback? вывод в отдельный поток?
Номер ответа: 14
Автор ответа:
Андрей
ICQ: 201110705
Вопросов: 1
Ответов: 14
Профиль | | #14
Добавлено: 07.02.05 19:56
Молодца - посторался.
А я раньше делал прогу используя Function InternetGetConnectedStateEx Lib "wininet.dll", накладок не случалось!
Номер ответа: 15
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #15
Добавлено: 07.02.05 21:16
Андрей, я те уже второй раз грю что не дураки мы, и прежде чем раздавать советы убедись что советуешь именно дело!!!
2Comanche, да, это CallBack, причем саму функцию получения данных, выполнение происходит мгновенно, а уже все события случаются в функции...