Что нового

Проверка на подключение к интернету WAN

bic

Новичок
Сообщения
46
Репутация
14
Здрасьте.
Скрипт проверяет наличие соединения с интернетом, но уж очень долго, примерно 6,3 секунды.

Код:
#Include <Timers.au3>
$connect = _GetNetworkConnect() ; переменная выясняет установлено ли соединение
$idle = _Timer_GetIdleTime() ; засекает время, после запуска скрипта
If $connect = "yes" or "no" then MsgBox(0,0,$idle)

; Функция проверки подключения к интернету.
Func _GetNetworkConnect()
    Local Const $NETWORK_ALIVE_WAN = 0x2
    Local $aRet
    $aRet = DllCall("sensapi.dll", "int", "IsNetworkAlive", "int*", 0)
    If BitAND($aRet[1], $NETWORK_ALIVE_WAN) Then
		Return "yes"
	Else
		Return "no"
	EndIf
EndFunc


Можно ли сделать быструю проверку на наличие соединения?
Например взять параметр со скриншота. Или еще как нибудь.
 

SyDr

Сидра
Сообщения
651
Репутация
158
bic [?]
$idle = _Timer_GetIdleTime() ; засекает время, после запуска скрипта
Это время, прошедшее с последней активности пользователя (мышь, клава).
Приведённая функция у меня отрабатывает не более, чем за 100 мс.
 

beve

Осваивающий
Сообщения
104
Репутация
30
SyDr [?]
Приведённая функция у меня отрабатывает не более, чем за 100 мс.
У меня около 1с, что тоже норм.Хотя если после запуска, все время шевелить мышкой, то показывает, о. :smile:. Действительно, зачем сдесь _Timer_GetIdleTime() автор поставил, эта функция сдесь не к месту... Нужно так, раз уж хочеш проверить сколько эта проверка занимает время:
Код:
$begin = TimerInit()
$connect = _GetNetworkConnect() 
$dif = Int(TimerDiff($begin))
MsgBox(0,"Время проверки: "&$dif/1000&"сек","Статуc: "&$connect)

Func _GetNetworkConnect()
Local Const $NETWORK_ALIVE_WAN = 0x2
Local $aRet
$aRet = DllCall("sensapi.dll", "int", "IsNetworkAlive", "int*", 0)
If BitAND($aRet[1], $NETWORK_ALIVE_WAN) Then
Return "yes"
Else
Return "no"
EndIf
EndFunc
 
Автор
B

bic

Новичок
Сообщения
46
Репутация
14
_Timer_GetIdleTime() - ну это я так время работы скрипта получаю
Эх, как бы мне получить 100мс
 
Автор
B

bic

Новичок
Сообщения
46
Репутация
14
[quote author=beve]
$dif = Int(TimerDiff($begin))
MsgBox(0,"Время проверки: "&$dif/1000&"сек","Статуc: "&$connect)
[/quote]
Всеравно 6,1 секунда
 

ynbIpb

Скриптер
Сообщения
398
Репутация
109
а чем не устраивает:
Код:
$begin = TimerInit()
sleep(3000)
$dif = TimerDiff($begin)
MsgBox(0,"Time Difference",$dif)

?

----------
эх.. опередили :whistle:
 

beve

Осваивающий
Сообщения
104
Репутация
30
bic [?]
Всеравно 6,1 секунда
А если так? Что наверное фактически тоже самое, только записано иначе и на несколько милисекунд дольше проверяется: :-\
Код:
$begin = TimerInit()
$connect = _GetNetworkConnect() 

$dif = Int(TimerDiff($begin))
MsgBox(0,"Время проверки: "&$dif/1000&"сек","Статуc: "&$connect)


Func _GetNetworkConnect()
Local $tTYPE, $iData, $iResult
$tTYPE = DllStructCreate("int")

DllCall("sensapi.dll", "int", "IsNetworkAlive", "ptr", DllStructGetPtr($tTYPE))
$iData = DllStructGetData($tTYPE, 1)

; Test Lan (0x1), Wan (0x2),AOL (0x3)
If BitAND($iData, 0x1) or BitAND($iData, 0x2) or BitAND($iData, 0x3) Then
$NetState = 1
Else
$NetState = 0
EndIf

Return $NetState
EndFunc ;==>_GetNetworkConnect
У меня показывает 0,005с. Странно то, что у тебя аж 6.
 
Автор
B

bic

Новичок
Сообщения
46
Репутация
14
beve
Спасибо конечно, но все равно 6,1 секунда.
Может потому, что autoit не установлен. Пользуюсь портативной версией с офф. сайта.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 702
Код:
#Include <WinAPI.au3>

$Timer = TimerInit()
$Status = _IsInternet()
$Diff = TimerDiff($Timer)
ConsoleWrite('Статус: ' & $Status & '   (' & Round($Diff / 1000, 3) & ' сек)' & @CR)

Func _IsInternet()
	Local $Ret = DllCall('wininet.dll', 'int', 'InternetGetConnectedState', 'dword*', 0x20, 'dword', 0)
	If @error Then
		Return SetError(1, 0, 0)
	EndIf
	Local $Error = _WinAPI_GetLastError()
	Return SetError((Not ($Error = 0)), $Error, $Ret[0])
EndFunc   ;==>_IsInternet


0.042 сек.
 
Автор
B

bic

Новичок
Сообщения
46
Репутация
14
Yashied
:laugh: Работает. Благодарю. 0.042
 

SyDr

Сидра
Сообщения
651
Репутация
158
Вот ещё один мазохисткий вариант. Осован на том, что rasdial, запущенный без параметров выводит имя соединения, если оно есть. В таком случае даже можно гость от платки отличить :blum:
~100 мс

Код:
#include <Constants.au3>
$Timer = TimerInit()
$Pid = Run("rasdial", @SystemDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
$bNet = False

While 1
    $sData = StdoutRead($Pid)
    If @error Then ExitLoop
    If StringInStr($sData, "BYFLY") Then $bNet = True
Wend

$Diff = TimerDiff($Timer)

If $bNet Then
	MsgBox(4096, $Diff, "Интернет есть")
Else
	MsgBox(4096, $Diff, "Нету")
EndIf
 

enk

Чайник
Сообщения
7
Репутация
1
А как можно всё это зациклить, что-бы проверка повторялась (например через 15 сек) и если соединение отсутствует - то восстанавливалось?
 
Автор
B

bic

Новичок
Сообщения
46
Репутация
14
Логин и пароль не забудь ввести.
Код:
Opt("TrayIconHide", 1)
#include <Constants.au3>

$connect = _CheckNet()

While 1
	If $connect = "no" Then
		Run ('Rasdial "byfly" "login" "pass"','',@SW_HIDE)
		ProcessWaitClose('Rasdial.exe')
		$connect = _CheckNet()
	EndIf

	while $connect = "byfly"
		sleep(15000)
		$connect = _CheckNet()
	wend
WEnd

; Функция проверки подключения к интернету.
Func _CheckNet()
	$Pid = Run("rasdial", @SystemDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
	$bNet = "no"
	While 1
		$sData = StdoutRead($Pid)
		If @error Then ExitLoop
		If StringInStr($sData, "byfly") Then $bNet = "byfly"
		Sleep(1)
	Wend
	return $bNet
EndFunc


Вообще настрой модем в режиме bridge, в режиме router у меня были постоянные дисконекты, техподдержка оказалась бессильна.
 

enk

Чайник
Сообщения
7
Репутация
1
Вот спасибеще!!!
Щас буду пробовать.
У меня BeeLine-USB, он не настраивается, нужно только отслеживать разрыв и заново коннектица. Логина и пароля нет. Достаточно будет:
ShellExecute ( "rasdial", "Beeline", "", "", @SW_HIDE)
 

xlgrgrc

Новичок
Сообщения
91
Репутация
7
А как предыдущий скрипт

Код:
;~ Opt("TrayIconHide", 1)
#include <Constants.au3>

$connect = _CheckNet()

While 1
    If $connect = "no" Then
        Run ('Rasdial "byfly" "login" "pass"','',@SW_HIDE)
        ProcessWaitClose('Rasdial.exe')
        $connect = _CheckNet()
    EndIf

    while $connect = "byfly"
        sleep(15000)
        $connect = _CheckNet()
    wend
WEnd

; Функция проверки подключения к интернету.
Func _CheckNet()
    $Pid = Run("rasdial", @SystemDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
    $bNet = "no"
    While 1
        $sData = StdoutRead($Pid)
        If @error Then ExitLoop
        If StringInStr($sData, "byfly") Then $bNet = "byfly"
        Sleep(1)
    Wend
    return $bNet
EndFunc


Перенастроить на мегафон модем. Скрин сделал. Желательно с проверкой каждую секунду.
 
Автор
B

bic

Новичок
Сообщения
46
Репутация
14
Вместо byfly поставь megafon internet и sleep не 15000 а 1000
 

Spartan

Чайник
Сообщения
7
Репутация
0
bic сказал(а):
Логин и пароль не забудь ввести.
Код:
Opt("TrayIconHide", 1)
#include <Constants.au3>

$connect = _CheckNet()

While 1
	If $connect = "no" Then
		Run ('Rasdial "byfly" "login" "pass"','',@SW_HIDE)
		ProcessWaitClose('Rasdial.exe')
		$connect = _CheckNet()
	EndIf

	while $connect = "byfly"
		sleep(15000)
		$connect = _CheckNet()
	wend
WEnd

; Функция проверки подключения к интернету.
Func _CheckNet()
	$Pid = Run("rasdial", @SystemDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
	$bNet = "no"
	While 1
		$sData = StdoutRead($Pid)
		If @error Then ExitLoop
		If StringInStr($sData, "byfly") Then $bNet = "byfly"
		Sleep(1)
	Wend
	return $bNet
EndFunc


Вообще настрой модем в режиме bridge, в режиме router у меня были постоянные дисконекты, техподдержка оказалась бессильна.
Я весь инет перерыл пока наткнулся на Ваш суперский вариант :ok: Одно огорчает, нужно еще через 5 секунд после восстановления соединения запускать одну программу. Я вставлял в разные части команду "Run" но ничего не получалось, мало что в этом понимаю, подскажите пожалуйста куда нужно вписать путь запуска чтоб он запускался только после восстановления интернета. Заранее спасибо!!
 
Автор
B

bic

Новичок
Сообщения
46
Репутация
14
all Вот немного переделанный скрипт для восстановления соединения.
Код:
Opt("TrayIconHide", 1)

; Вводим: имя подключения, логин, пароль (в кавычках).
$name = ""
$login = ""
$pass = ""

; При отсутствии соединения, подключаемся к интернету.
While 1
	If _CheckConnection() = 1 Then
		Sleep(10000)
	Else
		RunWait('Rasdial "' & $name & '" "' & $login & '" "' & $pass & '"', '', @SW_HIDE)
	EndIf
WEnd

; Функция проверки подключения к интернету.
Func _CheckConnection()
	$pid = Run("rasdial", "", @SW_HIDE, 0x2)
	While 1
		$line = StdoutRead($pid)
		If $line <> "" Then ExitLoop
	WEnd

	If StringInStr($line, $name) = 0 Then
		Return 0
	Else
		Return 1
	EndIf
EndFunc   ;==>_CheckConnection


Spartan А вот скрипт, который запускает программу через 5 секунд после каждого восстановления соединения.

Код:
Opt("TrayIconHide", 1)

; Вводим: имя подключения, логин, пароль (в кавычках).
$name = ""
$login = ""
$pass = ""

; Путь к программе.
$program = "C:\windows\system32\calc.exe"
$PRun = 0

; При отсутствии соединения, подключаемся к интернету.
While 1
	If _CheckConnection() = 1 Then
		If $PRun = 0 Then
			Sleep(5000)
			Run($program)
			$PRun = 1
		Else
			Sleep(10000)
		EndIf
	Else
		RunWait('Rasdial "' & $name & '" "' & $login & '" "' & $pass & '"', '', @SW_HIDE)
		$PRun = 0
	EndIf
WEnd

; Функция проверки подключения к интернету.
Func _CheckConnection()
	$pid = Run("rasdial", "", @SW_HIDE, 0x2)
	While 1
		$line = StdoutRead($pid)
		If $line <> "" Then ExitLoop
	WEnd

	If StringInStr($line, $name) = 0 Then
		Return 0
	Else
		Return 1
	EndIf
EndFunc   ;==>_CheckConnection
 
Верх