Wie im AutoIt Tratsch Thread schon beschrieben, möchte ich mit AutoIt eine größere Anzahl an IPs (Proxyserver) anpingen und das möglichst schnell.
Code:
Func _Ping($sIP, $iTimeout = 5096)
Local Const $iThreads = 300
Local $aProcessList = ProcessList('cmd.exe')
If $aProcessList[0][0] >= $iThreads Then
Do
Sleep(100)
$aProcessList = ProcessList('cmd.exe')
Until $aProcessList[0][0] <= $iThreads
EndIf
Local $sCommand = '1>> "' & $sIP & '.txt" ping ' & $sIP & ' /n 1 /w ' & $iTimeout
ShellExecute(@ComSpec, " /C " & $sCommand, @TempDir, 'open', @SW_HIDE)
Return '%PING%' & $sIP & '%PING%'
EndFunc ;==>_Ping
Func _PingResult($sIP)
Local $sResult = FileRead(@TempDir & '\' & $sIP & '.txt')
Local $aRegExp = StringRegExp($sResult, 'Mittelwert = (\d+)ms', 3)
FileDelete(@TempDir & '\' & $sIP & '.txt')
If IsArray($aRegExp) Then Return $aRegExp[0]
Return 'Timeout'
EndFunc ;==>_PingResult
Egal ob ich nun mehrere Autoit Scripte laufen habe, die ausführen, oder ob ich das via CMD.exe ping > file.txt mache, es bleibt immer ein Problem: 90%+ der Proxy Server sind nicht erreichbar. Wenn ich aber immer nur einen Ping Befehl nacheinander ausführe (For Schleife Array), dann funktionieren wesentlich mehr Proxys. Nur dauert das anpingen dann auch dementsprechend länger
Hat jemand eine Idee, an was das liegt und wie ich möglichst schnell viele IPs gleichzeitig anpingen kann?
Ziel ist, meine Proxyliste schneller aktualisieren zu können:
Da gibts Bann bei zu vielen Anfragen. Ich möchte soweit es geht auf fremde externe Seiten verzichten, da die meine Proxys dann in ihre eigene DB loggen könnten.
Außerdem muss der Rückgabewert auch wieder ausgelesen werden. Ich denke nicht, dass die 300 gleichzeitige Verbindungen zulassen werden, DNS/Whois lookups sind bei dieser Seite z.B. nur ~10 / Minute / IP möglich.
Hat jemand eine Idee, an was das liegt und wie ich möglichst schnell viele IPs gleichzeitig anpingen kann?
das problem hier liegt darinn, das pings ja über das icmp protokoll, und nicht etwa wie website aufrufe über tcp laufen...
da es leider keine icmp implementation in autoit gibt, müssten wir auf die icmp.dll zurückgreifen. diese hat in ihrer methode aber bereits eine schleife implementiert, welche auf ein ergebnis wartet, sodass hier keine "quasi-parallel" abarbeitung möglich ist...
die frage, welche sich hier aber eigentlich stellt ist: wozu einen server pingen, wenn man auch viel einfacher direkt einen verbindungstest via tcp protokoll starten kann?
Quote:
Originally Posted by butter123
vllt kannste damit noch was anstellen.
nur weil ein server in der lage ist, eine ip zu erreichen, heist das noch lange nicht, das auch du in der lage bist diese ip zu erreichen :P
diese hat in ihrer methode aber bereits eine schleife implementiert, welche auf ein ergebnis wartet, sodass hier keine "quasi-parallel" abarbeitung möglich ist...
Danke für die Aufklärung
Quote:
Originally Posted by lolkop
viel einfacher direkt einen verbindungstest via tcp protokoll starten kann?
Problem an dem bloßen Connecten ist das manche Proxies alive sind aber man keine requests ausführen darf, weshalb es auch wieder ungenau ist. Am besten ist ein Direkttest auf der Seite wo du die Proxies nutzen willst.
lolkop meint denke sowas:
PHP Code:
TCPStartup() $socket = TCPConnect($ip,$port) If $socket = -1 Then ;Proxy down Else ;Proxy alive TCPCloseSocket($socket) EndIf TCPShutdown()
die frage ist ja, was du dir in deiner liste erwünschst...
der vorteil am direkten verbindungsversuch ist, du kannst genauer scannen als ein einfacher ping befehl und siehst so beispielsweise sofort ob auch der angegebene port tatsächlich frei ist.
da du nicht auf antworten warten musst, bist du auch in jedem falle deutlich schneller, als ein ping es je sein könnte...
der nachteil ist aber, das du keine reaktionszeit bekommst, und somit keine aussage über die qualität der verbindung treffen kannst.
ein einfaches beispiel, welches mal den ersten und letzten eintrag aus deiner liste testet (da der letzte gleich ein beispiel für einen nicht funktionierenden proxi ist):
wie du erkennen wirst, gibt es auch in der tcpconnect funktion eine schleife mit timeout. du hast aber direkt den vorteil, das du über @error direkt an den fehler kommst ()
Edit:
Quote:
Originally Posted by expo_botter
Problem an dem bloßen Connecten ist das manche Proxies alive sind aber man keine requests ausführen darf, weshalb es auch wieder ungenau ist. Am besten ist ein Direkttest auf der Seite wo du die Proxies nutzen willst.
ein proxy auf den man keine requests über den gegeben port laufen lassen darf ist absolut nutzlos...
die einzige möglichkeit der nutzung wäre gegeben, wenn tatsächlich nur das tcp protokoll blockiert wird, was ja immernoch protokolle wie smtp, ... ermöglichen würde...
auch in diesem falle kann man aber über die wsa fehlermeldung ermitteln, das tcp connects nicht erlaubt sind.
Problem an dem bloßen Connecten ist das manche Proxies alive sind aber man keine requests ausführen darf, weshalb es auch wieder ungenau ist. Am besten ist ein Direkttest auf der Seite wo du die Proxies nutzen willst.
Mach das mal bei 20k Proxies ^^
Es muss schnell gehen, ob ein spezieller Proxy wirklich funktioniert oder nicht kann dann ja bei Bedarf getestet werden. Beziehungsweise beim ersten Einsatz des Proxys.
da du nicht auf antworten warten musst, bist du auch in jedem falle deutlich schneller, als ein ping es je sein könnte...
Dankeschön. TCPConnect funktioniert soweit auch ganz gut, schneller als Ping und auch mit Multitasking. Es gibt da jetzt nur noch ein Problem: Wenn der Host nicht erreichbar ist, dann verzögert das die Ausführung des TCPConnect Befehls sehr stark. Wie ich hier gelesen habe, lässt sich dieses Problem nicht beheben.
Hier mal mein Script (Ausschnitt):
Code:
If $CMDLINE[0] = 1 Then Exit FileWrite(@TempDir & '\' & StringReplace($CMDLINE[1], ':', '') & '.txt', _ProxyIsUp($CMDLINE[1]))
;Proxygrabber func // Achtung Pseudocode zur Veranschaulichung der wesentlichen Funktion
for $aProxylist = 0 to Ubound($aProxylist)-1
_ProxyIsUpExternal($aProxylist) ; Script mit Parametern starten, IP:Port Proxy überprüfen
next
for $aProxylist = 0 to Ubound($aProxylist)-1
$sHTML&=_ProxyIsUpExternalGetResult($aProxylist) ; Ergebnis des Proxytests aus Datei auslesen
next
; ...
Func _ProxyIsUp($sIPPort)
Local $aIP = StringRegExp($sIPPort, '(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\:(\d+)', 3)
;$aIP[0] = IP
$aIP[1] = Port
If IsArray($aIP) Then
If $CMDLINE[0] Then _IPGetCountry($aIP[0])
Local $sDownload, $iPing = TimerInit()
If TCPConnect($aIP[0], $aIP[1]) > 0 Then
$hSession = _WinHttpOpen('Mozilla/4.0')
$tProxyInfo = _WinHttpProxyInfoCreate($WINHTTP_ACCESS_TYPE_NAMED_PROXY, $aIP[0] & ':' & $aIP[1], "localhost")
_WinHttpSetOption($hSession, $WINHTTP_OPTION_PROXY, $tProxyInfo[0])
$hConnect = _WinHttpConnect($hSession, 'api.hostip.info')
$iPing = TimerInit()
$sDownload = _WinHttpSimpleRequest($hConnect, 'GET', '/get_html.php?ip=')
$iPing = Round(TimerDiff($iPing))
_WinHttpCloseHandle($hConnect)
_WinHttpCloseHandle($hSession)
If StringRegExp($sDownload, 'IP: \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}') Then
If $iPing < 260 Then Return '<font color="#00FF00">' & $iPing & '</font>'
If $iPing >= 5200 Then Return '<font color="#990000">' & $iPing & '</font>'
If $iPing >= 1300 Then Return '<font color="#FF6600">' & $iPing & '</font>'
If $iPing >= 500 Then Return '<font color="#FFCC00">' & $iPing & '</font>'
EndIf
EndIf
EndIf
Return '<font color="#FF0000"><span style="display:none">9999999</span>Offline</font>'
EndFunc ;==>_ProxyIsUp
Func _ProxyIsUpExternal($sIPPort)
Local Const $iThreads = 49
Local $aProcessList = ProcessList(@ScriptName)
If $aProcessList[0][0] >= $iThreads Then
Do
Sleep(10)
$aProcessList = ProcessList(@ScriptName)
Until $aProcessList[0][0] <= $iThreads
EndIf
Run(@ScriptFullPath & ' ' & $sIPPort, @TempDir, @SW_HIDE)
Return '%PING%' & $sIPPort & '%PING%'
EndFunc ;==>_ProxyIsUpExternal
Func _ProxyIsUpExternalGetResult($sIPPort)
Local $sReturn = FileRead(@TempDir & '\' & StringReplace($sIPPort, ':', '') & '.txt')
FileDelete(@TempDir & '\' & StringReplace($sIPPort, ':', '') & '.txt')
Return $sReturn
EndFunc ;==>_ProxyIsUpExternalGetResult
Etwa so ist mein Programm aufgebaut, wenn es Fragen zum Code gibt, bitte ich diese zu stellen
Verbesserungsvorschläge etc. sind willkommen, AutoIt Multitasking ist eben doch nicht allzu ressourcenschonend...
Die IP-Seite (api.hostip.info) werde ich später noch durch eine Seite ersetzen, die mir den Proxytyp ausgibt (anonym/transparent/elite), ein weglassen des Seitendownloads ist daher eher keine Option.
MfG und vielen Dank für die rege Beteiligung am Thread. :*
Schwankender Ping | 60-130 Ping 11/17/2012 - Technical Support - 11 Replies Hi Leute,
ich habe ein Problem, dass sich gerade bei LoL durchsetzt (ich weiß nicht genau bei welchen Spielen es noch der Fall ist).
Mein Ping schwankt so zwischen 60-130 Ping, er hält sich aber meist so bei 70 und geht dann hoch und man kann für 4-5 Sekunden mit heftigen Laggs rechnen. Dann stabilisert es sich meist wieder und kommt nach 20-30 Sekunden etwa wieder.
Ich habe ein DSL mit 3k ungefähr, also wirklich sehr lahm.
Meint ihr ich habe einen Trojaner bzw. generell ein Virus...
Ping Muito Alto[Very High Ping] 11/03/2011 - Perfect World - 1 Replies Portugues:
Gente o Meu PWBR Esta Com o Ping Muito Alto e Muita Lag Como Diminuo Isso
English:
My PWBR People With This Very High Ping Lag and How Much diminish that
[S] COD5 Server ohne Ping beschränkung / möglichst gute Server-Ping 09/24/2010 - General Gaming Discussion - 0 Replies Hey,
wie der Titel schon sagt, suche ich nen COD5 WaW Server, ohne Lags(egal ob gecrackt oder nicht, will nur zocken)
Es gibt nur zur zeit keine gescheiten Server für COD5 mehr!
Ich komme auch auf manche nicht, weil ich keine lust habe 2,5GB Patches runter zu laden!
Also bitte gebt mir ne Server IP oder nen Namen!