Что нового

Определение наиболее подходящего сервера по пингу

.me

Новичок
Сообщения
89
Репутация
0
Приветствую!
Возможно ли по списку серверов(update-ru.site.ru, update-ukr.site.ru, update-kz.site.ru и т.д) определить наиболее подходящий сервер для обновления исходя из пинга до сервера на котором обновление?
Например если вышло обновление вначале пинг из списка, определить наименьший пинг и оттуда скачать обновление
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Да, список серверов пишите в массив, в цикле делаете
Код:
ping
результат записывайте в другой массив, его затем сортируете через
Код:
_arraysort
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
.me [?]
пинг из списка, определить наименьший пинг и оттуда скачать обновление

Код:
#include-once
; Author: Garrett
#Region Vareable & Constants

Global $hICMPDll = 0

Global Const $IP_SUCCESS = 0                   ; The status was success.
Global Const $IP_BUF_TOO_SMALL = 11001         ; The reply buffer was too small.
Global Const $IP_DEST_NET_UNREACHABLE = 11002  ; The destination network was unreachable.
Global Const $IP_DEST_HOST_UNREACHABLE = 11003 ; The destination host was unreachable.
Global Const $IP_DEST_PROT_UNREACHABLE = 11004 ; The destination protocol was unreachable.
Global Const $IP_DEST_PORT_UNREACHABLE = 11005 ; The destination port was unreachable.
Global Const $IP_NO_RESOURCES = 11006          ; Insufficient IP resources were available.
Global Const $IP_BAD_OPTION = 11007            ; A bad IP option was specified.
Global Const $IP_HW_ERROR = 11008              ; A hardware error occurred.
Global Const $IP_PACKET_TOO_BIG = 11009        ; The packet was too big.
Global Const $IP_REQ_TIMED_OUT = 11010         ; The request timed out.
Global Const $IP_BAD_REQ = 11011               ; A bad request.
Global Const $IP_BAD_ROUTE = 11012             ; A bad route.
Global Const $IP_TTL_EXPIRED_TRANSIT = 11013   ; The time to live (TTL) expired in transit.
Global Const $IP_TTL_EXPIRED_REASSEM = 11014   ; The time to live expired during fragment reassembly.
Global Const $IP_PARAM_PROBLEM = 11015         ; A parameter problem.
Global Const $IP_SOURCE_QUENCH = 11016         ; Datagrams are arriving too fast to be processed and datagrams may have been discarded.
Global Const $IP_OPTION_TOO_BIG = 11017        ; An IP option was too big.
Global Const $IP_BAD_DESTINATION = 11018       ; A bad destination.
Global Const $IP_GENERAL_FAILURE = 11050       ; A general failure. This error can be returned for some malformed ICMP packets.


Global Const $tag_IP_OPTION_INFORMATION = _
	  "byte Ttl;" _
	 &"byte Tos;" _
	 &"byte FlagsFlagsFlagsFlags;" _
	 &"byte OptionsSize;" _
	 &"ptr OptionsData;"

Global Const $tag_ICMP_ECHO_REPLY = _
	  "ulong Address;" _
	 &"ulong Status;" _
	 &"ulong RoundTripTime;" _
	 &"ushort DataSize;" _
	 &"ushort Reserved;" _
	 &"ptr Data;" _
	 &"struct;"& $tag_IP_OPTION_INFORMATION &"endstruct;" ; IP_OPTION_INFORMATION

#EndRegion Vareable & Constants

#Region Functions

Func _ICMP_CreateFile()

   Local Const $INVALID_HANDLE_VALUE = Ptr(0)-1

   $a_Ret = DllCall("icmp.dll", "handle", "IcmpCreateFile")
   If $a_Ret[0] = $INVALID_HANDLE_VALUE Then ; GetLastError
	  Return SetError(1, 0, 0)
   EndIf

   Return SetError(0, 0, $a_Ret[0])
EndFunc ;==>_ICMP_CreateFile

Func _ICMP_CloseHandle($h_Icmp)

   $a_Ret = DllCall("icmp.dll", "bool", "IcmpCloseHandle", "handle", $h_Icmp)
   If $a_Ret[0] = False Then ; GetLastError
	  Return SetError(1, 0, 0)
   EndIf

   Return SetError(0, 0, 1)
EndFunc ;==>_ICMP_CloseHandle

Func _ICMP_SendEcho($h_Icmp, $i_DestIP, $p_ReplyBuff, $p_RequestOpt = 0, $i_Timeout = 3000, $p_RequestData = 0)

   $a_Ret = DllCall("icmp.dll", "ulong", "IcmpSendEcho", _
				    "ptr", $h_Icmp, "uint", $i_DestIP, _
				    "ptr", DllStructGetPtr($p_RequestData), "dword", DllStructGetSize($p_RequestData), _
				    "ptr", DllStructGetPtr($p_RequestOpt), _
				    "ptr", DllStructGetPtr($p_ReplyBuff), "dword", DllStructGetSize($p_ReplyBuff), _
				    "dword", $i_Timeout)
   If Not $a_Ret[0] Then
	  Return SetError(1, 0, 0)
   EndIf

   Return SetError(0, 0, $a_Ret[0])
EndFunc ;==> _ICMP_SendEcho

Func _Inet_Addr($s_IP)

   Local Const $INADDR_NONE = 0xFFFFFFFF

   $a_Ret = DllCall("wsock32.dll", "ulong", "inet_addr", "str", $s_IP)
   If $a_Ret[0] = $INADDR_NONE Then
	  Return SetError(1, 0, 0)
   EndIf

   Return SetError(0, 0, $a_Ret[0])
EndFunc ;==>_Inet_Addr

Func _Inet_Ntoa($i_IP)

   $a_Ret = DllCall("ws2_32.dll", "str", "inet_ntoa", "ulong", $i_IP)
   If Not $a_Ret[0] Then
	  Return SetError(1, 0, 0)
   EndIf

   Return SetError(0, 0, $a_Ret[0])
EndFunc ;==>_Inet_Ntoa

#EndRegion Functions

Код:
#include 'Icmp.au3'

Local $t_ICMP_ECHO_REPLY, $aDestIP[2][2] = [["autoit-script.ru", 0], ["www.autoitscript.com", 0]]

$t_ICMP_ECHO_REPLY = DllStructCreate($tag_ICMP_ECHO_REPLY & " byte[8];")

TCPStartup()
For $i = 0 To UBound($aDestIP) -1
   $aDestIP[$i][1] = TCPNameToIP($aDestIP[$i][0])
Next
TCPShutdown()

$hIcmp = _ICMP_CreateFile()

For $i = 0 To UBound($aDestIP) -1
   $iRet = _ICMP_SendEcho($hIcmp, _Inet_Addr($aDestIP[$i][1]), $t_ICMP_ECHO_REPLY)
   If $iRet <> 0 Then
	  ConsoleWrite(StringFormat("> Packet exchange with %s\n! Answer from %s: time=%s ms TTL=%s %s\n", _
								 $aDestIP[$i][0], _
								 _Inet_Ntoa($t_ICMP_ECHO_REPLY.Address), _
								 $t_ICMP_ECHO_REPLY.RoundTripTime, _
								 $t_ICMP_ECHO_REPLY.Ttl))
   EndIf
Next
_ICMP_CloseHandle($hIcmp)
 
Автор
M

.me

Новичок
Сообщения
89
Репутация
0
спасибо за ответы.
Garrett, а ваш код работает, только я немного не понял того, как в итоге вычислить более подходящий и использовать его
Код:
#include 'Icmp.au3'
#include <Array.au3>

Local $t_ICMP_ECHO_REPLY, $aDestIP[4][4] = [["update-ru.mysite.ru", 0], ["update-ukr1.mysite.ru", 0], ["update-ukr2.mysite.ru", 0], ["update-rureserve.mysite.ru", 0]]

$t_ICMP_ECHO_REPLY = DllStructCreate($tag_ICMP_ECHO_REPLY & " byte[8];")

TCPStartup()
For $i = 0 To UBound($aDestIP) -1
   $aDestIP[$i][1] = TCPNameToIP($aDestIP[$i][0])
Next
TCPShutdown()

$hIcmp = _ICMP_CreateFile()

For $i = 0 To UBound($aDestIP) -1
   $iRet = _ICMP_SendEcho($hIcmp, _Inet_Addr($aDestIP[$i][1]), $t_ICMP_ECHO_REPLY)
   If $iRet <> 0 Then
      ConsoleWrite(StringFormat("> Packet exchange with %s\n! Answer from %s: time=%s ms TTL=%s %s\n", _
                                 $aDestIP[$i][0], _
                                 _Inet_Ntoa($t_ICMP_ECHO_REPLY.Address), _
                                 $t_ICMP_ECHO_REPLY.RoundTripTime, _
                                 $t_ICMP_ECHO_REPLY.Ttl))
   EndIf
Next
_ICMP_CloseHandle($hIcmp)
$t_ICMP_ECHO_REPLY.RoundTripTime[10] = [4,3,2,1]
_ArraySort($t_ICMP_ECHO_REPLY.RoundTripTime, 1)
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
.me [?]
вычислить более подходящий

Код:
#include 'Icmp.au3'
#include <Array.au3>

Local $t_ICMP_ECHO_REPLY, $aDestIP[4][3] = [["update-ru.mysite.ru"], ["update-ukr1.mysite.ru"], ["update-ukr2.mysite.ru"], ["update-rureserve.mysite.ru"]]

$t_ICMP_ECHO_REPLY = DllStructCreate($tag_ICMP_ECHO_REPLY & " byte[8];")

TCPStartup()
For $i = 0 To UBound($aDestIP) -1
   $aDestIP[$i][1] = TCPNameToIP($aDestIP[$i][0])
Next
TCPShutdown()

$hIcmp = _ICMP_CreateFile()

For $i = 0 To UBound($aDestIP) -1
   $iRet = _ICMP_SendEcho($hIcmp, _Inet_Addr($aDestIP[$i][1]), $t_ICMP_ECHO_REPLY)
   If $iRet <> 0 Then
	  $aDestIP[$i][2] = $t_ICMP_ECHO_REPLY.RoundTripTime
   EndIf
Next
_ICMP_CloseHandle($hIcmp)

_ArraySort($aDestIP, 0, 0, 0, 2)
ConsoleWrite(StringFormat("> Fast server: %s time=%s\n", $aDestIP[0][0], $aDestIP[0][2]))
 
Автор
M

.me

Новичок
Сообщения
89
Репутация
0
Garrett, теперь понял, спасибо большое, все заработало, но опять же не понял как подставить полученный результат,
Код:
Fast server: update-ru.mysite.ru time=62

в этом случае подходит update-ru.mysite.ru - нужно как то вписать в переменную
Код:
http://www.update-ru.mysite.ru:8080/update.dat
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
.me [?]
нужно как то вписать в переменную

© Маша сказал(а):
Охохонюшки хо хо
Код:
$sFilePath = @ScriptDir &"\update.dat"
$hDownload = InetGet("http://"& $aDestIP[0][0] &":8080/update.dat", $sFilePath, $INET_FORCERELOAD, $INET_DOWNLOADBACKGROUND)
Do
   Sleep(250)
Until InetGetInfo($hDownload, $INET_DOWNLOADCOMPLETE)

$iBytesSize = InetGetInfo($hDownload, $INET_DOWNLOADREAD)
$iFileSize = FileGetSize($sFilePath)

InetClose($hDownload)

MsgBox($MB_SYSTEMMODAL, "", "The total download size: " & $iBytesSize & @CRLF & _
						    "The total filesize: " & $iFileSize)
 
Автор
M

.me

Новичок
Сообщения
89
Репутация
0
Garrett, огромное спасибо!
 
Автор
M

.me

Новичок
Сообщения
89
Репутация
0
подскажите, если серверов больше 4, должно на сколько я понял изменится значение
Код:
$aDestIP[4][3]

и как верно вычислить, скажем если добавить еще 2, 4, etc серверов?
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
.me [?]
как верно вычислить, скажем если добавить еще 2, 4, etc серверов?
Код:
#include <Array.au3>

Local $aDestIP[4][3] = [["update-ru.mysite.ru"], ["update-ukr1.mysite.ru"], ["update-ukr2.mysite.ru"], ["update-rureserve.mysite.ru"]]
_ArrayDisplay($aDestIP)

; Добавим сервера
$sAddSrv = 'update-jp.mysite.ru, update-mobi.mysite.ru'
$aAddSrv = StringSplit(StringStripWS($sAddSrv, 8), ',')

ReDim $aDestIP[UBound($aDestIP)+$aAddSrv[0]][3]

For $i = (UBound($aDestIP) - $aAddSrv[0]) To UBound($aDestIP) -1
   $aDestIP[$i][0] = $aAddSrv[($i - UBound($aAddSrv))]
Next
_ArrayDisplay($aDestIP)
 
Автор
M

.me

Новичок
Сообщения
89
Репутация
0
Garrett
Код:
#include 'Icmp.au3'
#include <Array.au3>


Local $t_ICMP_ECHO_REPLY, $aDestIP[6][5] = [["test.ru.site.ru"], ["test.ru1.site.ru"], ["test.ukr.site.ru"], ["test.ukr1.site.ru"], ["test.rureserve.site.ru"], ["test.rureserve1.site.ru"]]

$t_ICMP_ECHO_REPLY = DllStructCreate($tag_ICMP_ECHO_REPLY & " byte[8];")

TCPStartup()
For $i = 0 To UBound($aDestIP) -1
   $aDestIP[$i][1] = TCPNameToIP($aDestIP[$i][0])
Next
TCPShutdown()

$hIcmp = _ICMP_CreateFile()

For $i = 0 To UBound($aDestIP) -1
   $iRet = _ICMP_SendEcho($hIcmp, _Inet_Addr($aDestIP[$i][1]), $t_ICMP_ECHO_REPLY)
   If $iRet <> 0 Then
      $aDestIP[$i][2] = $t_ICMP_ECHO_REPLY.RoundTripTime
   EndIf
Next
_ICMP_CloseHandle($hIcmp)

_ArraySort($aDestIP, 0, 0, 0, 2)
ConsoleWrite(StringFormat("> Fast server: %s time=%s\n", $aDestIP[0][0], $aDestIP[0][2]))

ConsoleWrite($aDestIP[0][0])
$result = (StringFormat(StringReplace($aDestIP[0][0], "test", "update")))

что я делаю не так?=)
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
.me [?]
что я делаю не так?
Это вопрос не ко мне.
[box]Host Name : test.ru.site.ru
IP Address : test.ru.site.ru cannot be resolved to an IP Address

Host Name : test.ru1.site.ru
IP Address : test.ru1.site.ru cannot be resolved to an IP Address
[/box]
и т. д.
 
Верх