Что нового

[Сеть, интернет] Проверить доступность TCP порта

simba48

Новичок
Сообщения
14
Репутация
0
Суть задачи в следующем.
Требуется установить за минимальное время доступность 8000 URL в уже написанной программе на AutoIt.
Если доступ к сайтам по указанным URL блокируется по IP адресу для данного доменного имени сайта, то ответ на запрос через winhttp.winhttprequest.5.1 занимает слишком много времени.
Попытка использовать TCPConnect с уменьшением времени TCPTimeout результата не дала.
Исследовав вдоль и поперек Интернет 1, 2, 3 сделал вывод, что нормально реализовать задачу только с использованием AutoIt не предоставляется возможным.
Было решено попытать счастья путем опроса порта внешней программой.
На просторах Интернета была найдена подходящая утилита PortQry.exe.
С её помощью определение доступности порта в консоли занимает около 0,5 сек, что вполне устраивает.
Но при использовании утилиты PortQry.exe в коде AutoIt на выходе результата не вижу. Уважаемое сообщество AutoIt, прошу помочь.

Возможно кто-то решал нечто подобное и имеет опыт, которым может поделиться.

Кусок кода, в котором не вижу результата, выкладываю.
Код:
$TestAddress = "185.15.208.241"

$sServer = _CheckPort($TestAddress)

MsgBox(64, "Проверка сервера", $sServer)

Func _CheckPort($IPAddress)
Local $CheckPortCmd,$ResponseText,$IPPort
$IPPort = 80
$CheckPortCmd = RunWait (@ComSpec & " /c " & 'PortQry.exe -n ' & $IPAddress, "", @SW_HIDE)
$ResposeText = StdoutRead($CheckPortCmd)
Return $ResponseText
EndFunc
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Для запуска программ, нет смысла использовать @ComSpec, не следуйте глупой практике.
Запускайте PortQry.exe так:
Код:
Local $pid = Run('PortQry.exe -n ' & $IPAddress, @ScriptDir, @SW_HIDE, 0x8)
ProcessWaitClose($pid)
Local $stdout = StdoutRead($pid)
MsgBox(0,'',$stdout)




Добавлено:
Сообщение автоматически объединено:

Доступность URL легко проверить подобрав минимальное время ожидание отклика.
$WinHttpRequest.SetTimeouts(60000, 60000, 60000, 60000);тут все 4 параметра равны минуте, конечно, минута слишком много, эксперементируйте.
Это будет быстрее чем каждый раз вызывать PortQry.exe
 
Автор
S

simba48

Новичок
Сообщения
14
Репутация
0
Спасибо, заработало как надо.
inververs сказал(а):
Добавлено:
Сообщение автоматически объединено:

Доступность URL легко проверить подобрав минимальное время ожидание отклика.
$WinHttpRequest.SetTimeouts(60000, 60000, 60000, 60000);тут все 4 параметра равны минуте, конечно, минута слишком много, экспериментируйте.
Это будет быстрее чем каждый раз вызывать PortQry.exe
Суть в том, что манипуляция этими параметрами пробовалась, но нормального результата не достигнуто. Менее чем за примерно 2,5 сек ответ на запрос не приходил. Утилита в среднем дает ответ за 0,5 сек.
Чтобы задача была понятна, это 8000 должны быть недоступны и возможна их блокировка разными способами, где-то DNS подменяют и тогда все быстро определяется, а где-то IP блокируют и тогда всё грустно, и $WinHttpRequest.SetTimeouts(3000, 3000, 3000, 3000) не помогает.
Поэтому важна каждая секунда. Ведь 8000 сек это более 2 часов теста.

ps К сожалению PortQry.exe не подошла, но подошла другая утилита chkport.exe
Код:
$TestAddress = "185.15.208.241"
$TestPort = 80
$TestTime = 100

$sServer = _CheckPort($TestAddress,$TestPort,$TestTime)

MsgBox(64, "Проверка сервера", $sServer)

Func _CheckPort($IPAddress,$PortAddress, $WaitTime)
Local $pid = Run('chkport.exe ' & $IPAddress & ' ' & $PortAddress & ' ' & $WaitTime , @ScriptDir, @SW_HIDE, 0x8)
ProcessWaitClose($pid)
Local $stdout = StdoutRead($pid)
Return $stdout
EndFunc
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
simba48
Ясно. Вы случаем не роскомнадзор? ;D
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
WGet у меня проверяет ссылки где-то ~30 milliseconds 10 links.
Код:
; проверка ссылок в файле на доступность
RunWait(StringFormat("%s\wget -b --spider -i links.txt", @ScriptDir))
 
Автор
S

simba48

Новичок
Сообщения
14
Репутация
0
Garrett сказал(а):
WGet у меня проверяет ссылки где-то ~30 milliseconds 10 links.
Код:
; проверка ссылок в файле на доступность
RunWait(StringFormat("%s\wget -b --spider -i links.txt", @ScriptDir))
Мы не только ссылки проверяем, а потом еще и развернутый отчет делаем.
 

Вложения

  • EAIS1.JPG
    EAIS1.JPG
    67.1 КБ · Просмотры: 42
  • EAIS2.JPG
    EAIS2.JPG
    52.8 КБ · Просмотры: 27
  • EAIS3.JPG
    EAIS3.JPG
    53.7 КБ · Просмотры: 24

gloss

Ленивое кодило
Сообщения
155
Репутация
5
OffTopic:
inververs
Похоже как раз оттуда.
 
Автор
S

simba48

Новичок
Сообщения
14
Репутация
0
Garrett сказал(а):
WGet у меня проверяет ссылки где-то ~30 milliseconds 10 links.
Код:
; проверка ссылок в файле на доступность
RunWait(StringFormat("%s\wget -b --spider -i links.txt", @ScriptDir))
А если эти ссылки недоступны?
Заблокируете IP для указанных в ссылках доменных имен и, наверное, тут будет явно не 30 milliseconds.
Предложу простой тест.
Если сеть подключена через маршрутизатор с web администрированием, то обычно доступен адрес типа http://192.168.0.1/
Внесем 10 ссылок на этот адрес в файл links.txt
Проведем тест, получим затраты времени 30 milliseconds
Изменим файл links.txt
Укажем в ссылках порт 81 http://192.168.0.1:81/
Повторим тест.
Увидим, что время определения недоступности ссылок уже явно не 30 milliseconds
Таким образом, если при обращении к хосту порт недоступен (возможно и сам хост недоступен по протоколу TCP, хотя по ICMP отвечает), то на определение того, что он недоступен запросом GET тратится безумно много времени, поэтому имеет смысл перед запросом сделать короткий тест порта и только если тест положительный, то имеет смысл послать запрос GET.
Поэтому и искался вариант с опросом порта.
Если уважаемые гуру знают как за 0,5 секунд сделать опрос порта в AutoIt, то буду благодарен за подсказку в виде кода :IL_AutoIt_1:

ps Опять же, время ответа на запрос важно по причине того, что необходим тест 8000 заблокированных URL.

Хотя для wget можно установить таймауты в секундах wget -T 1, но с утилиткой chkport.exe время получается еще в 2 раза меньше - 0,5 сек.
D:\Yande:rofl:isk\Monitoring>wget -T 1 -t 1 --spider -S --no-cache --no-dns-cache ht
tp://192.168.10.1:81/
Spider mode enabled. Check if remote file exists.
--2015-01-09 15:39:18-- http://192.168.10.1:81/
Connecting to 192.168.10.1:81... failed: Connection timed out.
Giving up.


D:\Yande:rofl:isk\Monitoring>wget -T 1 -t 1 --spider -S --no-cache --no-dns-cache ht
tp://192.168.10.1:80/
Spider mode enabled. Check if remote file exists.
--2015-01-09 15:39:25-- http://192.168.10.1/
Connecting to 192.168.10.1:80... connected.
HTTP request sent, awaiting response...
HTTP/1.1 501 Not Implemented
Server: micro_httpd
Cache-Control: no-cache
Date: Fri, 09 Jan 2015 15:39:30 GMT
Content-Type: text/html
Connection: close
 
Автор
S

simba48

Новичок
Сообщения
14
Репутация
0
Пробуем ещё один способ, через libcurl. curl дает возможность задать время ожидания ответа на запрос GET. Проверяли, допустим минимум 10 мс. Меньше нет смысла проверять. Нормальным для решаемой задачи будет и 500 мс. При этом, если получен ответ на запрос, то мы имеем заголовок и можем его анализировать.

Пока экспериментируем с утилиткой chkport.exe

Вопрос к гуру, а при использовании TCPNameToIP($domain) информация из Windows DNS Cache об IP для доменного имени не берется? Судя по всему, при каждом обращении к функции идет обращение к DNS серверу.

CommandLine parameters - 3
- parameter 1: chkport_adr.txt
- parameter 2: 80
- parameter 3: 300
22:54:49 ===== CheckPort(port:80, timeout:300) ================================
AdrFile - 'chkport_adr.txt'
Line 1 (467ms): 134931 mirror140.graniru.info [50.56.52.205] Port listening
Line 2 (453ms): 134902 mirror139.graniru.info [50.56.52.205] Port listening
.............
Checked 7448 IP: 2800777ms (average: 376)
- Listening: 4029
- NotListening: 126
- Skiped: 3085
- IPErrors: 208
- Unknown: 0
NameToIP Time: 1157425ms (average: 265)
ExecProg Time: 3651ms (average: 0)
CheckPort Time: 1626165ms (average: 391)
22:37:31 ===== CheckPort finished =============================================
NameToIP Time: - время, потраченное на определение IP адреса
ExecProg Time: - время, потраченное на запуск chkport.exe
CheckPort Time: - время, потраченное на определение доступности порта
 
Верх