Форум » [x]Harbour » Как узнать когда комп подключается к Инету ! » Ответить

Как узнать когда комп подключается к Инету !

Andrey: Всем привет ! Подскажите пожалуйста: как написать прогу, которая бы отлавливала подключение к Инету ? Хочу сделать добавление в БАЗУ-LetoDB из локальной БАЗЫ с компьютера при появление интернет соединения ! Заранее спасибо.

Ответов - 38, стр: 1 2 All

Dima: [pre2] // в первом приближении hInternet := InternetOpen() if hInternet <> 0 // бла бла бла endif [/pre2] ps what32.lib

Andrey: Что-то не получается собрать.... Выдает кучу ошибок: Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland Error: Unresolved external 'InternetDial' referenced from Z:\TEST\WHAT32.LIB|_WinINet Error: Unresolved external 'InternetGetConnectedState' referenced from Z:\TEST\WHAT32.LIB|_WinINet Error: Unresolved external 'InternetOpenA' referenced from Z:\TEST\WHAT32.LIB|_WinINet Error: Unresolved external 'InternetConnectA' referenced from Z:\TEST\WHAT32.LIB|_WinINet Error: Unresolved external 'FtpOpenFileA' referenced from Z:\TEST\WHAT32.LIB|_WinINet Error: Unresolved external 'InternetWriteFile' referenced from Z:\TEST\WHAT32.LIB|_WinINet Error: Unresolved external 'InternetReadFile' referenced from Z:\TEST\WHAT32.LIB|_WinINet Error: Unresolved external 'FtpCommandA' referenced from Z:\TEST\WHAT32.LIB|_WinINet Error: Unresolved external 'FtpFindFirstFileA' referenced from Z:\TEST\WHAT32.LIB|_WinINet Error: Unresolved external 'InternetFindNextFileA' referenced from Z:\TEST\WHAT32.LIB|_WinINet Error: Unresolved external 'FtpGetFileA' referenced from Z:\TEST\WHAT32.LIB|_WinINet Error: Unresolved external 'FtpPutFileA' referenced from Z:\TEST\WHAT32.LIB|_WinINet Error: Unresolved external 'FtpCreateDirectoryA' referenced from Z:\TEST\WHAT32.LIB|_WinINet Error: Unresolved external 'FtpRemoveDirectoryA' referenced from Z:\TEST\WHAT32.LIB|_WinINet Error: Unresolved external 'FtpDeleteFileA' referenced from Z:\TEST\WHAT32.LIB|_WinINet Error: Unresolved external 'FtpRenameFileA' referenced from Z:\TEST\WHAT32.LIB|_WinINet Error: Unresolved external 'FtpGetCurrentDirectoryA' referenced from Z:\TEST\WHAT32.LIB|_WinINet Error: Unresolved external 'FtpSetCurrentDirectoryA' referenced from Z:\TEST\WHAT32.LIB|_WinINet Error: Unresolved external 'InternetCloseHandle' referenced from Z:\TEST\WHAT32.LIB|_WinINet Error: Unresolved external 'InternetAttemptConnect' referenced from Z:\TEST\WHAT32.LIB|_WinINet Что делать ?

Dima: Andrey пишет: Что делать ? Прилинкуй c:\bcc55\lib\wininet.lib


Andrey: Собрал прогу ! Фигня получается.... Пишет ВСЕГДА ЕСТЬ интернет !!! FUNCTION MAIN() LOCAL hInternet hInternet := InternetOpen() if hInternet <> 0 ? "Есть ИНТЕРНЕТ....." else ? "Нет ИНТЕРНЕТА....." endif ?? hInternet ? wait RETURN NIL Возвращает всегда "Есть ИНТЕРНЕТ..... 13369348" ?

Dima: Тогда вот так ;) ? InternetGetConnectedState()

Andrey: Dima пишет: Тогда вот так ;) ? InternetGetConnectedState() Возвращает .Т. даже когда подключена просто локальная сеть. Какие еще будут предложения ?

gfilatov: Andrey пишет: Какие еще будут предложения ? Посмотри рабочий пример из поставки МиниГУИ (папка samples\Advanced\Inet_Checker): // Flags for InternetGetConnectedState and Ex #define INTERNET_CONNECTION_MODEM 1 #define INTERNET_CONNECTION_LAN 2 #define INTERNET_CONNECTION_PROXY 4 #define INTERNET_CONNECTION_MODEM_BUSY 8 /* no longer used */ #define INTERNET_RAS_INSTALLED 16 #define INTERNET_CONNECTION_OFFLINE 32 #define INTERNET_CONNECTION_CONFIGURED 64 // Flag for InternetCheckConnection #define FLAG_ICC_FORCE_CONNECTION 1 *--------------------------------------------------------* Function IsConnected() *--------------------------------------------------------* local nFlags := 0, lRet := .f. if CallDll32( "InternetGetConnectedState", "WININET.DLL", @nFlags, 0 ) == 1 if CallDll32( "InternetCheckConnection", "WININET.DLL", "http://www.google.com", ; FLAG_ICC_FORCE_CONNECTION, 0 ) == 1 lRet := .t. endif endif RETURN lRet

Andrey: Спасибо Григорий !!! Чувствуется рука мастера .... Буду пробовать.....

Dima: Andrey пишет: Возвращает .Т. даже когда подключена просто локальная сеть. у меня возвращает .f. в этом случае

Andrey: Dima пишет: у меня возвращает .f. в этом случае У меня городская локальная сеть, и возвращает .T. даже если VPN-соединение отключено.

Andrey: Сделал програмку, как Григорий порекомендовал. Добавил к себе в проект cdll.c и hdll.prg FUNCTION MAIN() LOCAL lInet lInet := IsConnected() if lInet ? "Есть ИНТЕРНЕТ....." else ? "Нет ИНТЕРНЕТА....." endif wait RETURN NIL Если Интернет подключен, то быстро сообщает. А если его нет, то просто чума, программа минут 5 его ищет. Можно ли как нибудь ускорить этот процесс ?

Петр: Для Windows 2000 Professional, Windows 2000 Server, Windows XP, Windows Server 2003 можно использовать такую версию IsConnected() (не забываем подключить sensapi.lib ) #pragma BEGINDUMP #include "windows.h" #include "sensapi.h" #include "hbapi.h" HB_FUNC( ISCONNECTED ) { DWORD dwFlag; BOOL bRes = FALSE; if ( IsNetworkAlive(&dwFlag) && dwFlag & NETWORK_ALIVE_WAN ) { if( IsDestinationReachable("http://www.google.com", NULL) ) { bRes = TRUE; } } hb_retl( bRes ); } #pragma ENDDUMP

Andrey: Спасибо БОЛЬШОЕ Петр ! Твоя версия самая быстрая .... Выдает моментально ! Видать вызов DLL слишком медленный... Но вариант Григория все равно пригодиться для использования в других случаях.

Andrey: Возвращаюсь опять к этой теме ! Петр, не работает твой последний вариант !!! Исходник: FUNCTION MAIN() LOCAL lInet lInet := IsConnected() if lInet ? "Есть ИНТЕРНЕТ....." else ? "Нет ИНТЕРНЕТА....." endif wait RETURN NIL #pragma BEGINDUMP #include "windows.h" #include "sensapi.h" #include "hbapi.h" HB_FUNC( ISCONNECTED ) { DWORD dwFlag; BOOL bRes = FALSE; if ( IsNetworkAlive(&dwFlag) && dwFlag & NETWORK_ALIVE_WAN ) { if( IsDestinationReachable("http://www.google.com", NULL) ) { bRes = TRUE; } } hb_retl( bRes ); } #pragma ENDDUMP Сейчас у меня установлен роутер, так вот на нем возращает: ? "Нет ИНТЕРНЕТА....." Что делать ? Можно ли создать универсальный вариант: для VPN и для роутеров ?

Andrey: Вариант Григория из МиниГУИ (папка samples\Advanced\Inet_Checker) работает сейчас быстро и правильно, но портировать код на хХарбор не могу. Можно ли заменить вызов CallDll32() на CallDll() из хХарбора ? и как тогда будет выглядеть код ? Программа Григория: FUNCTION MAIN() LOCAL lInet lInet := IsConnected() if lInet ? "Есть ИНТЕРНЕТ....." else ? "Нет ИНТЕРНЕТА....." endif wait RETURN NIL // Flags for InternetGetConnectedState and Ex #define INTERNET_CONNECTION_MODEM 1 #define INTERNET_CONNECTION_LAN 2 #define INTERNET_CONNECTION_PROXY 4 #define INTERNET_CONNECTION_MODEM_BUSY 8 /* no longer used */ #define INTERNET_RAS_INSTALLED 16 #define INTERNET_CONNECTION_OFFLINE 32 #define INTERNET_CONNECTION_CONFIGURED 64 // Flag for InternetCheckConnection #define FLAG_ICC_FORCE_CONNECTION 1 *--------------------------------------------------------* Function IsConnected() *--------------------------------------------------------* local nFlags := 0, lRet := .f. if CallDll32( "InternetGetConnectedState", "WININET.DLL", @nFlags, 0 ) == 1 if CallDll32( "InternetCheckConnection", "WININET.DLL", "http://www.google.com", ; FLAG_ICC_FORCE_CONNECTION, 0 ) == 1 lRet := .t. endif endif RETURN lRet И к нему еще нужно цеплять hdll.prg....

Dima: Andrey Функции IsNetworkAlive , IsDestinationReachable из какой оперы (библиотеки) ?

Andrey: Dima пишет: Функции IsNetworkAlive , IsDestinationReachable из какой оперы (библиотеки) ? Из sensapi.lib ! Ну обижаешь .... Уже выучился чуть-чуть.... Прицеплена к программе Петра ! Не писал бы об этом, если работало...

Dima: Andrey пишет: Из sensapi.lib Пардон , не заметил.

Pasha: Andrey пишет: Хочу сделать добавление в БАЗУ-LetoDB из локальной БАЗЫ с компьютера при появление интернет соединения ! Андрей, так ты эту функцию добавляешь в сервер letodb ?

Andrey: Pasha пишет: Андрей, так ты эту функцию добавляешь в сервер letodb ? Да хотел, потом передумал. Делаю отдельную программу для клиента, чтоб когда ИНЕТ включался, то на сервер копировались (синхронизировались) записи с клиента ! ИНЕТ же отрубается, а юзверу не объяснишь, что это не проблемы моей программы.

Andrey: Andrey пишет: Вариант Григория из МиниГУИ (папка samples\Advanced\Inet_Checker) работает сейчас быстро и правильно, но портировать код на хХарбор не могу. Можно ли заменить вызов CallDll32() на CallDll() из хХарбора ? и как тогда будет выглядеть код ? Программа Григория: FUNCTION MAIN() LOCAL lInet lInet := IsConnected() if lInet ? "Есть ИНТЕРНЕТ....." else ? "Нет ИНТЕРНЕТА....." endif wait RETURN NIL // Flags for InternetGetConnectedState and Ex #define INTERNET_CONNECTION_MODEM 1 #define INTERNET_CONNECTION_LAN 2 #define INTERNET_CONNECTION_PROXY 4 #define INTERNET_CONNECTION_MODEM_BUSY 8 /* no longer used */ #define INTERNET_RAS_INSTALLED 16 #define INTERNET_CONNECTION_OFFLINE 32 #define INTERNET_CONNECTION_CONFIGURED 64 // Flag for InternetCheckConnection #define FLAG_ICC_FORCE_CONNECTION 1 *--------------------------------------------------------* Function IsConnected() *--------------------------------------------------------* local nFlags := 0, lRet := .f. if CallDll32( "InternetGetConnectedState", "WININET.DLL", @nFlags, 0 ) == 1 if CallDll32( "InternetCheckConnection", "WININET.DLL", "http://www.google.com", ; FLAG_ICC_FORCE_CONNECTION, 0 ) == 1 lRet := .t. endif endif RETURN lRet Так кто же поможет в этом нелегком деле ???

Dima: CallDll( <pFunction> [,<xParams,...>] ) --> xResult // The example implements a simple command line utility // that opens a file using the associated file viewer. PROCEDURE Main( cFile ) LOCAL nDll, pFunc IF cFile == NIL .OR. .NOT. File( cFile ) CLS ? "File name must be specified" QUIT ENDIF nDll := DllLoad( "Shell32.dll" ) pFunc := GetProcAddress( nDll, "ShellExecute" ) ? CallDll( pFunc, 0, "open", cFile, NIL, NIL, 1 ) DllUnload( nDll ) RETURN

Andrey: Dima пишет: CallDll( <pFunction> [,<xParams,...>] ) --> xResult Так это кусок из Хелпа.... А мне вот это переделать нужно: if CallDll32( "InternetGetConnectedState", "WININET.DLL", @nFlags, 0 ) == 1 if CallDll32( "InternetCheckConnection", "WININET.DLL", "http://www.google.com", ; FLAG_ICC_FORCE_CONNECTION, 0 ) == 1 lRet := .t. endif endif Там кол-во передаваемых параметров разное !

santy: в xHarbour есть функция DllCall(), попробуй использовать её.

Andrey: santy пишет: в xHarbour есть функция DllCall(), попробуй использовать её. Вы меня извините, а мое предыдущее сообщение вы читали ? Или только заголовок начального сообщения ?

Петр: Андрей, santy дал нормальный совет, в чем дело? [pre2] #define DC_CALL_STD 0x0020 #define INTERNET_CONNECTION_MODEM 1 #define INTERNET_CONNECTION_LAN 2 #define INTERNET_CONNECTION_PROXY 4 #define INTERNET_RAS_INSTALLED 16 #define INTERNET_CONNECTION_OFFLINE 32 #define INTERNET_CONNECTION_CONFIGURED 64 // Flag for InternetCheckConnection #define FLAG_ICC_FORCE_CONNECTION 1 proc main() local nFlags := 0 local lRet := .f. if DllCall( "WININET.DLL", DC_CALL_STD, "InternetGetConnectedState", @nFlags, 0 ) == 1 if DllCall( "WININET.DLL", DC_CALL_STD, "InternetCheckConnection", "http://www.google.com", FLAG_ICC_FORCE_CONNECTION, 0 ) == 1 lRet := .t. endif endif ? lRet return[/pre2]

Andrey: Петр пишет: Андрей, santy дал нормальный совет, в чем дело? Так я и про это писал. По хелпу [CallDll( <pFunction> [,<xParams,...>] ) --> xResult] там 2 параметра, я же не знал, что можно больше ! До этого Дима мне про эту функцию написал, я ему написал про 2 параметра. А потом santy пишет что типа воспользуйся этой функцией ! Ну я уже про 2 параметра ему писать не стал ! Посчитал за повтор... Извини santy ! Спасибо Петр за исправленный исходник. Теперь мне понятно, как в таких случаях делать !

Петр: Andrey пишет: По хелпу [CallDll( <pFunction> [,<xParams,...>] ) --> xResult] там 2 параметра, я же не знал, что можно больше ! До этого Дима мне про эту функцию написал, я ему написал про 2 параметра. А потом santy пишет что типа воспользуйся этой функцией ! Во первых CallDll функция с переменным числом аргументов и на это четко указывают три точки в определении функции; Во вторых CallDll и DllCall - это две разные функции.

Andrey: Петр пишет: и на это четко указывают три точки в определении функции; Спасибо Петр ! Теперь буду знать ! Функцию твою вставил к себе в программу ! Работает !!!

santy: Andrey пишет: Извини santy ! Пробежали

Andrey: Возник вопрос, по проверке работоспособности сайта. Не долго думая, взял пример Григория из поставки МиниГУИ (папка samples\Advanced\Inet_Checker): и заменил адрес http://www.google.com на адрес проверяемого сайта. Если проверяемый сайт "лежит" (не открывается в браузере), то функция из примера IsConnected() все равно выдает .T. Что есть - неправильно. Какие есть еще варианты/функции проверки работоспособности сайта ?

Dima: Andrey пишет: Если проверяемый сайт "лежит" (не открывается в браузере) Наводящий вопрос: пинг на "лежащий" сайт проходит нормально ? PS Вот такого сайта нет и что выдаст тест на него ? http://www.skdjhfksjdhfkjsd.com/

Andrey: Dima пишет: Наводящий вопрос: пинг на лежащий сайт проходит нормально ? Да ! Нормально. Пакетов: отправлено = 4, получено = 4, потеряно = 0 (0% потерь) Приблизительное время приема-передачи в мс: Минимальное = 6мсек, Максимальное = 7 мсек, Среднее = 6 мсек

Dima: Andrey А на тот что в PS ?

Andrey: Dima пишет: Вот такого сайта нет и что выдаст тест на него ? http://www.skdjhfksjdhfkjsd.com/ Переделанный пример (samples\Advanced\Inet_Checker) - выдает .F. Мой "висящий" сайт - выдает .T. Пример короткий: FUNCTION MAIN(cSite) LOCAL lInet lInet := IsConnectedInet(cSite) ? cSite if lInet ? "Yes INTERNET....." else ? "No internet....." endif ? wait RETURN NIL #define DC_CALL_STD 0x0020 #define INTERNET_CONNECTION_MODEM 1 #define INTERNET_CONNECTION_LAN 2 #define INTERNET_CONNECTION_PROXY 4 #define INTERNET_RAS_INSTALLED 16 #define INTERNET_CONNECTION_OFFLINE 32 #define INTERNET_CONNECTION_CONFIGURED 64 // Flag for InternetCheckConnection #define FLAG_ICC_FORCE_CONNECTION 1 FUNCTION IsConnectedInet(cSite) local nFlags := 0 local lRet := .f. if DllCall( "WININET.DLL", DC_CALL_STD, "InternetGetConnectedState", @nFlags, 0 ) == 1 if DllCall( "WININET.DLL", DC_CALL_STD, "InternetCheckConnection", cSite, FLAG_ICC_FORCE_CONNECTION, 0 ) == 1 lRet := .t. endif endif Return lRet Только нужно указать для сборки calldll.lib

Dima: Ответ как бы сам напрашивается. Надо анализировать HTML форму или что там на сайте. Пример есть тут Наверное (не уверен) но это самый правильный подход , ведь сайту могут и DDOS устроить , так что анализ не помешает.

petr707: Все же уже есть minigui\samples\basic\socket - TestHttp Если главная страница сайта прочитана и не пустая - сайт доступен.

Andrey: petr707 пишет: Все же уже есть То что надо ! "Подвисший" сайт выдает нулевую строку ! Спасибо !



полная версия страницы