PDA

Показать полную графическую версию : Наилучший способ проверки наличия интернета


Страниц : [1] 2

sashadeg
27-02-2010, 14:26
Я знаю 3 способа проверки наличия интернета, может кто знает ещё какой-нибудь?
И какой из них самый оптимальный?

1. Вернуть IP адресс, и если он НЕ равен -1, то инет есть. (долгий)
2. Пинговать google.com или какой-нибудь другой глобальный сервер (я считаю что этот самый оптимальный. ИМХО)
3. _WinAPI_IsNetworkAlive

Вот о последнем хотел узнать поподробнее..., как эта функция проверяет наличие интернета? Тоже пингует? Или как?

_________________________________добавил__________________________________
если _getIP использовать с повторением в 5-10 сек, он не нагрузит интернет? Или как нибудь косвенно повлияет на систему?

madmasles
27-02-2010, 15:52
как эта функция проверяет наличие интернета »Откройте C:\Program Files\AutoIt3\Include\WinAPIEx.au3 и найдите нужную Вам функцию.
По-моему, _WinAPI_IsNetworkAlive самый оптимальный способ.

sashadeg
27-02-2010, 16:14
Откройте C:\Program Files\AutoIt3\Include\WinAPIEx.au3 »
Я в том мало что понимаю =)

Просто если стандартные экранчики в трее показывают наличие интернета, то это не значит что он есть =)
Может эта функция берёт инфу из windows? значит не факт =)

Creat0R
27-02-2010, 22:29
Есть вот такой вариант:

$Connected = IsConnected()

If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) Not (http://www.autoitscript.com/autoit3/docs/keywords.htm#Not) $Connected Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
MsgBox (http://www.autoitscript.com/autoit3/docs/functions/MsgBox.htm)(0,"","Соединение отсутствует" & @LF (http://www.autoitscript.com/autoit3/docs/macros.htm#@LF) & $Connected)
Else (http://www.autoitscript.com/autoit3/docs/keywords.htm#Else)
MsgBox (http://www.autoitscript.com/autoit3/docs/functions/MsgBox.htm)(0,"","Соединение установлено [" & $Connected & "]")
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)

Func (http://www.autoitscript.com/autoit3/docs/keywords.htm#Func) IsConnected($sPingHost="google.com", $iPingTimeOut=1000)
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $iPing_Results = Ping (http://www.autoitscript.com/autoit3/docs/functions/Ping.htm)($sPingHost, $iPingTimeOut)
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $iPing_Results > 0 Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) $iPing_Results

Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $hWinInetDll = DllOpen (http://www.autoitscript.com/autoit3/docs/functions/DllOpen.htm)("wininet.dll")
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $hWinInetDll = -1 Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) SetError (http://www.autoitscript.com/autoit3/docs/functions/SetError.htm)(1, 0, -1)

Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $aRet = DllCall (http://www.autoitscript.com/autoit3/docs/functions/DllCall.htm)($hWinInetDll, "int", "InternetGetConnectedState", "int", 0, "int", 0)
DllClose (http://www.autoitscript.com/autoit3/docs/functions/DllClose.htm)($hWinInetDll)

If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) IsArray (http://www.autoitscript.com/autoit3/docs/functions/IsArray.htm)($aRet) Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
$aRet = $aRet[0]
Else (http://www.autoitscript.com/autoit3/docs/keywords.htm#Else)
$aRet = 0
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)

If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $aRet And (http://www.autoitscript.com/autoit3/docs/keywords.htm#And) $iPing_Results <= 0 Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) 0

Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) $aRet
EndFunc (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndFunc)

Вот тут (http://forum.oszone.net/post-1147238.html#post1147238) есть ещё пример.

sashadeg
28-02-2010, 07:05
Creat0R, прикольный скрипт, но Вы сможете рассказать плюсы и минусы этого способа?
Вижу подключается wininet.dll, что он делает?

madmasles
28-02-2010, 10:39
sashadeg,
Вот еще тема:Проверка на подключение к интернету WAN (http://autoit-script.ru/index.php?topic=573.0)

Вижу подключается wininet.dll, что он делает? »Есть бесплатная утилита от NirSoft, в которой можно посмотреть функции в dll: DLL Export Viewer v1.36 (http://www.nirsoft.net/utils/dll_export_viewer.html)

Creat0R
28-02-2010, 15:58
плюсы и минусы этого способа»
Не знаю на счёт минусов, но плюс в том что проверяется подключение более надёжно - сначала проверяется Ping, а затем (если он неудачно отработал) проверяется состояние подключения сети.

ижу подключается wininet.dll, что он делает? »
Используя эту dll вызывается функция «InternetGetConnectedState», которая проверяет тип подключения к сети.

Creat0R
28-02-2010, 16:39
Вот сделал пример отображающий состояние подключения в GUI (на основе этого примера (http://sources.ru/vb/network/internetgetconnectedstate.shtml) на vb):

#include <GUIConstantsEx.au3>
#include <EditConstants.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>

$aConnection_State = _InternetGetConnectedState()

GUICreate (http://www.autoitscript.com/autoit3/docs/functions/GUICreate.htm)("_InternetGetConnectedState", 270, 320)

GUICtrlCreateLabel (http://www.autoitscript.com/autoit3/docs/functions/GUICtrlCreateLabel.htm)("Connected via MODEM:", 20, 20)
GUICtrlCreateInput (http://www.autoitscript.com/autoit3/docs/functions/GUICtrlCreateInput.htm)($aConnection_State[1][0], 150, 17, 100)

GUICtrlCreateLabel (http://www.autoitscript.com/autoit3/docs/functions/GUICtrlCreateLabel.htm)("Connected via LAN:", 20, 50)
GUICtrlCreateInput (http://www.autoitscript.com/autoit3/docs/functions/GUICtrlCreateInput.htm)($aConnection_State[2][0], 150, 47, 100)

GUICtrlCreateLabel (http://www.autoitscript.com/autoit3/docs/functions/GUICtrlCreateLabel.htm)("Connected via PROXY:", 20, 80)
GUICtrlCreateInput (http://www.autoitscript.com/autoit3/docs/functions/GUICtrlCreateInput.htm)($aConnection_State[3][0], 150, 77, 100)

GUICtrlCreateLabel (http://www.autoitscript.com/autoit3/docs/functions/GUICtrlCreateLabel.htm)("Modem busy:", 20, 110)
GUICtrlCreateInput (http://www.autoitscript.com/autoit3/docs/functions/GUICtrlCreateInput.htm)($aConnection_State[4][0], 150, 107, 100)

GUICtrlCreateLabel (http://www.autoitscript.com/autoit3/docs/functions/GUICtrlCreateLabel.htm)("Connection RAS installed:", 20, 140)
GUICtrlCreateInput (http://www.autoitscript.com/autoit3/docs/functions/GUICtrlCreateInput.htm)($aConnection_State[5][0], 150, 137, 100)

GUICtrlCreateLabel (http://www.autoitscript.com/autoit3/docs/functions/GUICtrlCreateLabel.htm)("Connection is offline:", 20, 170)
GUICtrlCreateInput (http://www.autoitscript.com/autoit3/docs/functions/GUICtrlCreateInput.htm)($aConnection_State[6][0], 150, 167, 100)

GUICtrlCreateLabel (http://www.autoitscript.com/autoit3/docs/functions/GUICtrlCreateLabel.htm)("Connection description:", 20, 200)
GUICtrlCreateEdit (http://www.autoitscript.com/autoit3/docs/functions/GUICtrlCreateEdit.htm)("", 20, 220, 230, 80, $ES_WANTRETURN)

For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $i = 1 To (http://www.autoitscript.com/autoit3/docs/keywords.htm#To) $aConnection_State[0][0]
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $aConnection_State[$i][0] Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) GUICtrlSetData (http://www.autoitscript.com/autoit3/docs/functions/GUICtrlSetData.htm)(-1, "* " & $aConnection_State[$i][1] & @CRLF (http://www.autoitscript.com/autoit3/docs/macros.htm#@CRLF), 1)
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)

GUISetState (http://www.autoitscript.com/autoit3/docs/functions/GUISetState.htm)(@SW_SHOW (http://www.autoitscript.com/autoit3/docs/macros.htm#@SW_SHOW))

While (http://www.autoitscript.com/autoit3/docs/keywords.htm#While) 1
Switch (http://www.autoitscript.com/autoit3/docs/keywords.htm#Switch) GUIGetMsg (http://www.autoitscript.com/autoit3/docs/functions/GUIGetMsg.htm)()
Case (http://www.autoitscript.com/autoit3/docs/keywords.htm#Case) $GUI_EVENT_CLOSE
Exit (http://www.autoitscript.com/autoit3/docs/keywords.htm#Exit)
EndSwitch (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndSwitch)
WEnd (http://www.autoitscript.com/autoit3/docs/keywords.htm#WEnd)

Func (http://www.autoitscript.com/autoit3/docs/keywords.htm#Func) _InternetGetConnectedState()
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) Const (http://www.autoitscript.com/autoit3/docs/keywords.htm#Const) $INTERNET_CONNECTION_MODEM = 0x1 ;Local system uses a modem to connect to the Internet.
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) Const (http://www.autoitscript.com/autoit3/docs/keywords.htm#Const) $INTERNET_CONNECTION_LAN = 0x2 ;Local system uses a local area network to connect to the Internet.
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) Const (http://www.autoitscript.com/autoit3/docs/keywords.htm#Const) $INTERNET_CONNECTION_PROXY = 0x4 ;Local system uses a proxy server to connect to the Internet.
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) Const (http://www.autoitscript.com/autoit3/docs/keywords.htm#Const) $INTERNET_CONNECTION_MODEM_BUSY = 0x8 ;No longer used.
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) Const (http://www.autoitscript.com/autoit3/docs/keywords.htm#Const) $INTERNET_RAS_INSTALLED = 0x10 ;Remote Access Services are installed on this system.
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) Const (http://www.autoitscript.com/autoit3/docs/keywords.htm#Const) $INTERNET_CONNECTION_OFFLINE = 0x20 ;Local system is in offline mode.
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) Const (http://www.autoitscript.com/autoit3/docs/keywords.htm#Const) $INTERNET_CONNECTION_CONFIGURED = 0x40 ;Local system has a valid connection to the Internet, but it might or might not be currently connected.

Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $aRetState[7][2] = [[UBound (http://www.autoitscript.com/autoit3/docs/functions/UBound.htm)($aRetState)-1]]
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $aRet = DllCall (http://www.autoitscript.com/autoit3/docs/functions/DllCall.htm)("WinInet.dll", "int", "InternetGetConnectedState", "int*", 0, "int", 0)

;For AutoIt < 3.2.10.0 the next line should be used
;Local $aRet = DllCall("WinInet.dll", "int", "InternetGetConnectedState", "int_ptr", 0, "int", 0)

If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) UBound (http://www.autoitscript.com/autoit3/docs/functions/UBound.htm)($aRet) > 0 And (http://www.autoitscript.com/autoit3/docs/keywords.htm#And) $aRet[0] Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
$aRetState[1][0] = BitAND (http://www.autoitscript.com/autoit3/docs/functions/BitAND.htm)($aRet[1], $INTERNET_CONNECTION_MODEM) <> 0
$aRetState[1][1] = "The local system uses a modem to connect to the Internet."

$aRetState[2][0] = BitAND (http://www.autoitscript.com/autoit3/docs/functions/BitAND.htm)($aRet[1], $INTERNET_CONNECTION_LAN) <> 0
$aRetState[2][1] = "The local system connects to the Internet via a LAN"

$aRetState[3][0] = BitAND (http://www.autoitscript.com/autoit3/docs/functions/BitAND.htm)($aRet[1], $INTERNET_CONNECTION_PROXY) <> 0
$aRetState[3][1] = "The local system uses a proxy server to connect to the Internet."

If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $aRetState[3][0] Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
$aRetState[2][1] &= ", and uses a proxy server."
Else (http://www.autoitscript.com/autoit3/docs/keywords.htm#Else)
$aRetState[2][1] &= "."
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)

$aRetState[4][0] = BitAND (http://www.autoitscript.com/autoit3/docs/functions/BitAND.htm)($aRet[1], $INTERNET_CONNECTION_MODEM_BUSY) <> 0
$aRetState[4][1] = "The local system's modem is busy with a non-Internet connection."

$aRetState[5][0] = BitAND (http://www.autoitscript.com/autoit3/docs/functions/BitAND.htm)($aRet[1], $INTERNET_RAS_INSTALLED) <> 0
$aRetState[5][1] = "Remote Access Services are installed on this system."

$aRetState[6][0] = BitAND (http://www.autoitscript.com/autoit3/docs/functions/BitAND.htm)($aRet[1], $INTERNET_CONNECTION_OFFLINE) <> 0
$aRetState[6][1] = "The connection is currently offline."
Else (http://www.autoitscript.com/autoit3/docs/keywords.htm#Else)
Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) SetError (http://www.autoitscript.com/autoit3/docs/functions/SetError.htm)(1, 0, _WinAPI_GetLastErrorMessage())
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)

Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) $aRetState
EndFunc (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndFunc)

madmasles
28-02-2010, 17:05
Creat0R,
"Ругается" : WARNING: $aRetState: possibly used before declaration. Добавил в начале Dim $aRetStateперестала "ругаться", работает :)

sashadeg
28-02-2010, 19:39
проверяется подключение более надёжно - сначала проверяется Ping, а затем (если он неудачно отработал) проверяется состояние подключения сети. »
Вот именно это я щас проверил, если ввожу вместо "google.ru" какой-нибудь не сушествующий адрес (чтобы не пропинговало) то всё-равно показывает, будто нету инета.

Может попробовать пропинговать, если пинг не удался, то вернуть IP. А если пинг удался, то сразу показать что инет есть, без возврашения IP?

Creat0R
28-02-2010, 19:52
Ругается »
Это если проверять синтаксиси? по идее я сделал неправильно, нужно явно указать размерность массива:
Local $aRetState[7][2] = [[6]]

если ввожу вместо "google.ru" какой-нибудь не сушествующий адрес (чтобы не пропинговало) то всё-равно показывает, будто нету инета »
Всё верно, там нужно указывать существующий адрес, это как бы ещё и проверка на отзывчивость сервера :)

sashadeg
28-02-2010, 20:32
Всё верно, там нужно указывать существующий адрес, это как бы ещё и проверка на отзывчивость сервера »
хммм... тогда я может неправельно понял вот эту фразу?:
сначала проверяется Ping, а затем (если он неудачно отработал) проверяется состояние подключения сети. »
Зачем тогда проверять состояние подключения сети, если после НЕУДАЧНОЙ пинговки одного сервера выходит сообщение о неработоспособности всего интернета? А если пинг прошел УДАЧНО, то опять же зачем проверять состояние сети? Не думаю что пинг будет при нерабочем состоянии сети :)
или я что-то не понимаю?

Sp01LeR
28-02-2010, 21:00
Зачем тогда проверять состояние подключения сети, если после НЕУДАЧНОЙ пинговки одного сервера выходит сообщение о неработоспособности всего интернета? »
Чтобы знать где проблема -
если пинг прошел удачно с google.ru - все ок
если пинг вернул таймаут, но соединение установлено - значит виноват твой провайдер
если соединение не установлено(если перед этим было открыто) - значит провайдер закрыл соединение или ошибка ОС(неожиданная перезагрузка) и т.д.

Creat0R
28-02-2010, 23:35
ачем тогда проверять состояние подключения сети, если после НЕУДАЧНОЙ пинговки одного сервера выходит сообщение о неработоспособности всего интернета? »
Сервер может и не отвечать ;) - Это как бы подстраховка.

centaurvv
03-03-2010, 02:22
Откройте C:\Program Files\AutoIt3\Include\WinAPIEx.au3 и найдите нужную Вам функцию.
По-моему, _WinAPI_IsNetworkAlive самый оптимальный способ »

Что-то я у себя не нахожу этот файл, как впрочем и функцию _WinAPI_IsNetworkAlive в списке доступных функций.
Эт я чего-то еще не докачал? :)

madmasles
03-03-2010, 02:56
centaurvv,
WinAPIEx (http://autoit-script.ru/index.php?topic=47.0)

Yashied
03-03-2010, 05:04
Можно так (достаточно быстрый способ) или как советовал madmasles.

#Include <WinAPI.au3>

; #FUNCTION# ==================================================================================================== ====================
; Function Name: _IsInternet
; Description: Check for Internet connection.
; Syntax: _IsInternet ( )
; Parameter(s): None.
; Return Value(s): Success: Returns 1.
; Failure: Returns 0 and sets the @error flag to non-zero. @extended flag will contain the error code
; are specific to the WinINet functions.
;
; Author(s): Yashied
; Note(s): -
;=================================================================================================== =================================

Func _IsInternet()

Local $Ret = DllCall('wininet.dll', 'int', 'InternetGetConnectedState', 'dword*', 0x20, 'dword', 0)

If (@error) Then
Return SetError(1, 0, 0)
EndIf

Local $wError = _WinAPI_GetLastError()

Return SetError((Not ($wError = 0)), $wError, $Ret[0])
EndFunc ;==>_IsInternet

ConsoleWrite(_IsInternet() & @CR)

El Scorpio
03-03-2010, 05:19
1. Вернуть IP адресс, и если он НЕ равен -1, то инет есть. (долгий)
2. Пинговать google.com или какой-нибудь другой глобальный сервер (я считаю что этот самый оптимальный. ИМХО)
3. _WinAPI_IsNetworkAlive »

1 - неправильный. Адрес может быть получен от DHCP-сервера локальной сети, но в этой сети для интернета может потребоваться создание коммутируемого подключения
3 - хз,*что за функция, но возражения опять таки, как в п.1
Вариант №4 - проверка активности коммутируемого подключения. Возражения противоположные п.1 - интернет может быть доступен через маршрутизатор локальной сети.

Оптимальным является п.2

sashadeg
03-03-2010, 17:14
Yashied, спасибо. Ну как я понял это та же конфетка что и у Creat0R только в другой бумажке =)

В общем к концу темы я склоняюсь у ДВУМ вариантам... Второй мне нравится больше ,но хз надежный ли он? А первый - давно провереный метод, но иногда глючный.
1. Пинг
2. WinAPI (см далее)#Include <WinAPI.au3>

; #FUNCTION# ==================================================================================================== ====================
; Function Name: _IsInternet
; Description: Check for Internet connection.
; Syntax: _IsInternet ( )
; Parameter(s): None.
; Return Value(s): Success: Returns 1.
; Failure: Returns 0 and sets the @error flag to non-zero. @extended flag will contain the error code
; are specific to the WinINet functions.
;
; Author(s): Yashied
; Note(s): -
;=================================================================================================== =================================

Func _IsInternet()

Local $Ret = DllCall('wininet.dll', 'int', 'InternetGetConnectedState', 'dword*', 0x20, 'dword', 0)

If (@error) Then
Return SetError(1, 0, 0)
EndIf

Local $wError = _WinAPI_GetLastError()

Return SetError((Not ($wError = 0)), $wError, $Ret[0])
EndFunc ;==>_IsInternet

ConsoleWrite(_IsInternet() & @CR)

Yashied
03-03-2010, 19:52
Согласно вот этому (http://support.microsoft.com/kb/242558), какой бы способ не был выбран, без запроса к серверу нельзя однозначно сказать есть ли соединение с интернетом или нет. Вот такая вот путаница...




© OSzone.net 2001-2012