Что нового

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

in-com

Новичок
Сообщения
28
Репутация
0
Здравствуйте. Нужен скриптик, который проверял бы сервер с указанным в окне ввода ip-адресом и портом на доступность и в случае обнаружения такого выдавал сообщение о статусе. Поиск по форуму не помог.
С уважением, in-com
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
Без порта - просто через ping:
Код:
$sIp = InputBox('Input IP-address', 'Input IP-address', 'google.ru')
$var = Ping($sIp, 250)
If $var Then
    Msgbox(0, 'Status', 'Online, roundtrip was:' & $var)
Else
    Msgbox(0, 'Status', 'An error occured with number: ' & @error)
EndIf


С указанием порта (TCP):
Код:
$sIp = InputBox('Input IP-address & port', 'Input IP-address & port through ":"', '74.125.232.17:80')
TCPStartup()
$aIp = StringSplit($sIp, ':')
$socket = TCPConnect($aIp[1], $aIp[2])
If @error Then
    MsgBox(16, 'Error', 'Connection is not established!')
Else
    MsgBox(64, 'Done', 'Connection accepted!')
    TCPCloseSocket($socket)
EndIf
TCPShutdown()

Для UDP всё аналогично
 

axlwor

Скриптер
Сообщения
657
Репутация
147
т.е. везде вместо TCPStartup прописать UDP ?
То есть не полениться и хотя бы мельком просмотреть справку по Network Management. Вспомнить что такое UDP или узнать, что udp работает без соединения
 
Автор
I

in-com

Новичок
Сообщения
28
Репутация
0
Мне всего лишь нужен скрипт, который проверяет сервера на заданном ip и порту (от 21 до 28000). То есть неважно какой сервер, главное, чтобы скрипт определил его статус (в сети или нет)
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Код:
$sServer = "google.com"
$iPort = 80

If _HTTPServerIsOnline($sServer, $iPort) Then
	MsgBox(64, "Проверка сервера", "Сервер [" & $sServer & "] on-line.")
Else
	MsgBox(48, "Проверка сервера", "Сервер [" & $sServer & "] НЕ on-line.")
EndIf

Func _HTTPServerIsOnline($sServer, $iPort = 80)
	TCPStartup()
	
	Local $sName_To_IP = TCPNameToIP($sServer)
	Local $iSocket = TCPConnect($sName_To_IP, $iPort)
	
	If $iSocket = -1 Then
		TCPCloseSocket($iSocket)
		Return SetError(1, 0, "")
	EndIf
	
	Local $sCommand = "HEAD / HTTP/1.1" & @CRLF
	
	$sCommand &= "Host: " & $sServer & @CRLF
	$sCommand &= "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8" & @CRLF
	$sCommand &= "Referer: " & $sServer & @CRLF
	$sCommand &= "Connection: close" & @CRLF & @CRLF
	
	Local $iBytesSent = TCPSend($iSocket, $sCommand)
	If $iBytesSent = 0 Then Return SetError(2, @error, 0)
	
	Local $sRecv = "", $sCurrentRecv
	
	While 1
		$sCurrentRecv = TCPRecv($iSocket, 16)
		
		If @error <> 0 Then
			ExitLoop
		EndIf
		
		If $sCurrentRecv <> "" Then
			$sRecv &= $sCurrentRecv
		EndIf
	WEnd
	
	TCPCloseSocket($iSocket)
	TCPShutdown()
	
	Return StringRegExp($sRecv, "(?i)HTTP/\d.\d (200|301)") = 1
EndFunc
 
Автор
I

in-com

Новичок
Сообщения
28
Репутация
0
CreatoR
А есть ли какой-нибудь скрипт сканера портов (от 21 до 28000) ?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
in-com [?]
есть ли какой-нибудь скрипт сканера портов
Циклом можно проверить, но это может занять много времени:

Код:
$sServer = "google.com"

$iStart_Port = 21
$iEnd_Port = 28000

For $iPort = $iStart_Port To $iEnd_Port
	ConsoleWrite("Current Port: " & $iPort & @LF)
	
	If _HTTPServerIsOnline($sServer, $iPort, 5000) Then
		MsgBox(64, "Проверка сервера", "Сервер [" & $sServer & "] on-line с использованием порта: " & $iPort)
	EndIf
Next

Func _HTTPServerIsOnline($sServer, $iPort = 80, $iTimeOut = 10000)
    TCPStartup()
	
    Local $sName_To_IP = TCPNameToIP($sServer)
    Local $iSocket = TCPConnect($sName_To_IP, $iPort)
    
    If $iSocket = -1 Then
        TCPCloseSocket($iSocket)
        Return SetError(1, 0, "")
    EndIf
    
    Local $sCommand = "HEAD / HTTP/1.1" & @CRLF
    
    $sCommand &= "Host: " & $sServer & @CRLF
    $sCommand &= "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8" & @CRLF
    $sCommand &= "Referer: " & $sServer & @CRLF
    $sCommand &= "Connection: close" & @CRLF & @CRLF
    
    Local $iBytesSent = TCPSend($iSocket, $sCommand)
    If $iBytesSent = 0 Then Return SetError(2, @error, 0)
    
    Local $sRecv = "", $sCurrentRecv, $iTimer = TimerInit()
    
    While 1
        $sCurrentRecv = TCPRecv($iSocket, 16)
        
        If @error <> 0 Or TimerDiff($iTimer) >= $iTimeOut Then
            ExitLoop
        EndIf
        
        If $sCurrentRecv <> "" Then
            $sRecv &= $sCurrentRecv
        EndIf
    WEnd
    
    TCPCloseSocket($iSocket)
    TCPShutdown()
    
    Return StringRegExp($sRecv, "(?i)HTTP/\d.\d (200|301)") = 1
EndFunc
 
Автор
I

in-com

Новичок
Сообщения
28
Репутация
0
CreatoR сказал(а):
Циклом можно проверить, но это может занять много времени:
Нужно, чтобы он проверял не только TCP порты а еще и FTP, UDP и некоторые порты типа 27015-27030.
Возможно ли это осуществить с помощью AutoIT?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
in-com [?]
Нужно, чтобы он проверял не только TCP порты а еще и FTP, UDP и некоторые порты типа 27015-27030
Я с этим особо не знаком, эти порты нужно проверять по другому протоколу? тогда это сложнее...
Но возможно :smile:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
in-com [?]
порты 27015-27030 используют UDP протокол
Можно так попробовать:

Код:
TCPStartup()
UDPStartup()

$sServer = "google.com"
$iStart_Port = 21
$iEnd_Port = 28000

For $iPort = $iStart_Port To $iEnd_Port
    ConsoleWrite("Current Port: " & $iPort & @LF)
    
    If ($iPort >= 27015 And $iPort <= 27030 And _UDPServerIsOnline($sServer, $iPort, 5000)) Or ($iPort < 27015 And _TCPServerIsOnline($sServer, $iPort, 5000)) Then
        MsgBox(64, "Проверка сервера", "Сервер [" & $sServer & "] on-line с использованием порта: " & $iPort)
    EndIf
Next

TCPShutdown()
UDPShutdown()

Func _TCPServerIsOnline($sServer, $iPort = 80, $iTimeOut = 10000)
    Local $sName_To_IP = TCPNameToIP($sServer)
    Local $iSocket = TCPConnect($sName_To_IP, $iPort)
    
    If $iSocket = -1 Then
        TCPCloseSocket($iSocket)
        Return SetError(1, 0, "")
    EndIf
    
    Local $sCommand = "HEAD / HTTP/1.1" & @CRLF
    
    $sCommand &= "Host: " & $sServer & @CRLF
    $sCommand &= "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8" & @CRLF
    $sCommand &= "Referer: " & $sServer & @CRLF
    $sCommand &= "Connection: close" & @CRLF & @CRLF
    
    Local $iBytesSent = TCPSend($iSocket, $sCommand)
    If $iBytesSent = 0 Then Return SetError(2, @error, 0)
    
    Local $sRecv = "", $sCurrentRecv, $iTimer = TimerInit()
    
    While 1
        $sCurrentRecv = TCPRecv($iSocket, 16)
        
        If @error <> 0 Or TimerDiff($iTimer) >= $iTimeOut Then
            ExitLoop
        EndIf
        
        If $sCurrentRecv <> "" Then
            $sRecv &= $sCurrentRecv
        EndIf
    WEnd
    
    TCPCloseSocket($iSocket)
    
    Return StringRegExp($sRecv, "(?i)HTTP/\d.\d (200|301)") = 1
EndFunc

Func _UDPServerIsOnline($sServer, $iPort = 80, $iTimeOut = 10000)
    Local $sName_To_IP = TCPNameToIP($sServer)
    Local $iSocket = UDPOpen($sName_To_IP, $iPort)
    
    If $iSocket = -1 Then
        UDPCloseSocket($iSocket)
        Return SetError(1, 0, "")
    EndIf
    
    Local $sCommand = "HEAD / HTTP/1.1" & @CRLF
    
    $sCommand &= "Host: " & $sServer & @CRLF
    $sCommand &= "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8" & @CRLF
    $sCommand &= "Referer: " & $sServer & @CRLF
    $sCommand &= "Connection: close" & @CRLF & @CRLF
    
    Local $iBytesSent = UDPSend($iSocket, $sCommand)
    If $iBytesSent = 0 Then Return SetError(2, @error, 0)
    
    Local $sRecv = "", $sCurrentRecv, $iTimer = TimerInit()
    
    While 1
        $sCurrentRecv = UDPRecv($iSocket, 16)
        
        If @error <> 0 Or TimerDiff($iTimer) >= $iTimeOut Then
            ExitLoop
        EndIf
        
        If $sCurrentRecv <> "" Then
            $sRecv &= $sCurrentRecv
        EndIf
    WEnd
    
    UDPCloseSocket($iSocket)
    
    
    Return StringRegExp($sRecv, "(?i)HTTP/\d.\d (200|301)") = 1
EndFunc
 
Автор
I

in-com

Новичок
Сообщения
28
Репутация
0
CreatoR сказал(а):
Можно так попробовать
Не помогло :(
Дело в том, что на этих портах работают игровые сервера Half-Life и ее модификации. Есть даже специальные программы типа: HL-CS serversmon. Весят они мало ~ 100-200 Kb, но мне бы хотелось такое на AutoIT.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
in-com [?]
Мне всего лишь нужен скрипт, который проверяет сервера на заданном ip и порту (от 21 до 28000). То есть неважно какой сервер, главное, чтобы скрипт определил его статус (в сети или нет)
Если вы хотите проверять статус серверов Counter Strike то зачем вам сканировать порты:
[box]21 FTP
22 SSH
23 Telnet
25 Порт SMTP отвечающий за передачу почты
43 Порт клиента WHOIS
53 Система преобразования имени хоста
80 Стандартный порт HTTP Веб севрера
110 Порт POP отвечает за приём почты
995 Защищённое SSL/TLS соединение POP
143 IMAP Протокол приёма почты
993 Защищённое соединение IMAP
443 Защищённое HTTP соединение (SSL для https:// )
3306 MysQL Сервер
631 Протоколы сетевой печати
5900 Система удаленного доступа к компьютеру VNC (Virtual Network Computing) и.т.д[/box]
ни одна игра их не использует! ;)
Код:
#include <Array.au3>
Global $t = 0
Dim $iCount = 0
Dim $iIP = "93.81.248.130"
Dim $aPort[2] = [26000,29000]

OnAutoItExitRegister("_Cleanup()")
AdlibRegister("_Timer", 300)

UDPStartup()

For $i = $aPort[0] To $aPort[1]
    If _Status($iIP, $i) Then
        $iCount += 1
        $iMsg = MsgBox(262212, "On Line!", "Сервер найден!" &@LF & $iIP &":"& $i)
        If $iMsg = 7 Then
            ExitLoop
        EndIf
    EndIf
Next
MsgBox(262208, "Выполнено!", "Поиск серверов закончен!" & @LF & "Найден (" & $iCount & ") сервер.")

Func _Status($iIP, $iPort)
    $_Socket = UDPOpen($iIP, $iPort)
        If @error <> 0 Then Exit
    $_Status = UDPSend($_Socket, "0xFFFFFFFF6765746368616C6C656E6765")
    If $_Status = 0 then
        MsgBox(16, "Ошибка!", "Ошибка отправки сообщения: " & @error)
        Exit
    EndIf
    
    Do
        $iData = UDPRecv($_Socket, 100, 1)
        If $iData <> "" Then
            Return 1
        EndIf
    Until $t = 1
    Return 0
EndFunc

Func _Timer()
    $t = 1
    Return $t
EndFunc

Func _Cleanup()
    AdlibUnRegister("_Timer()")
    UDPCloseSocket($_Socket)
    UDPShutdown()
EndFunc
 
Автор
I

in-com

Новичок
Сообщения
28
Репутация
0
Garrett сказал(а):
статус серверов Counter Strike
Большое спасибо! То, что нужно.
Еще бы хотелось помеситить все это в GUI интерфейс с полями ввода ip и порта а так-же добавить проверку ftp и http серверов.
 

Sp01LeR

Знающий
Сообщения
45
Репутация
12
Код:
        If @error <> 0 Or TimerDiff($iTimer) >= $iTimeOut Then
            ExitLoop
        EndIf

А зачем этот велосипед?
Опция TCPTimeout() разве не решает ту же задачу?
 

Sp01LeR

Знающий
Сообщения
45
Репутация
12
А почему? Подозреваю, что TCPTimeout актуален только при TCPConnect, хотя в справке написано:

Defines the time before TCP functions stop if no communication.
Time in milliseconds before timeout (default=100).

- там TCP функции во множественном числе.
 
Автор
I

in-com

Новичок
Сообщения
28
Репутация
0
а как в этот скрипт добавить проверку ftp и tcp серверов и поместить это все в gui-интерфейс?
 
Автор
I

in-com

Новичок
Сообщения
28
Репутация
0
Ладно, если никто не знает, как это осуществить, тогда ставлю тему решеной.
 
Верх