Hallo ich wollte mal fragen ob es möglich ist bei ein file Transfer von tcp download Speed Limit einzubauen? Sprich, dass er nicht mit maximaler Power lädt sondern nur mit 100kb/sec
und noch eine frohe weihnacht
Hallo ich wollte mal fragen ob es möglich ist bei ein file Transfer von tcp download Speed Limit einzubauen? Sprich, dass er nicht mit maximaler Power lädt sondern nur mit 100kb/sec
und noch eine frohe weihnacht
Ja, indem du nur 100 kB Daten pro Sekunde sendest. Dafür könntest du mit Fullspeed verschicken und wenn 100 kB erreicht sind die restliche Zeit der Sekunde sleepen. (das ist natürlich die schlechtere Variante)
Oder du ermittelst deine Durchschnittsgeschwindigkeit und rechnest das runter das du immer kleine Bruchteile sleepst.
Ich habe so eine Funktion gefunden für den file Transfer die die Datei Dan aufteilt und sendet also soll ich Dan nur wen x nicht erfüllt ist 100kb senden und Dan sleep oder wie meinst du das bzw wen ich zB 4 pc habe die was gleichzeitig uploaden ist Dan nicht der Server überfordert ?
Für sowas gibts doch Multithreading bzw. Multiprocessing
Hast du dafür eventuell mal ein Beispiel? Habe mal so ein multi threading Code gefunden aber griege das nie hin,
Du kannst ja einen Listener bauen der Verbindungen annimmt und dann ein Script startet, diese Verbindung übergibt und der Client an das zweite Scripte hochlädt. Multithreading in AutoIt ist stabil nicht möglich deshalb solltest du auf Multiprocessing zurückgreifen. (Mehrere Scripte).
Das Multithreading in autoit instabil ist habe ich schon rausgefunden da mir schon oft mein Script abgestürzt ist da es ein Befehl angeblich nicht kannte aber alles korrekt war. Ich danke dir alpines, ich code schon länger in autoit doch so langsam möchte ich auch schwerere Sachen machen und nicht auf den Grundlagen verharren deswegen diese Frage
Nichts zu danken, dafür sind wir da.
Alpines ich hätte da noch eine Frage ist es möglich eine dll zu schreiben die eine variable x erhält Dan diese in ein URL einfügt und den Rückgabe wert von https GET zurück gibt? Oder tut sich da nicht viel wen ich das mit autoit mache?
Formulier das bitte nochmal neu, ich habs nicht verstanden. Du willst eine DLL schreiben die die du mit einem bestimmten Parameter callest (URL beispielsweise) und die DLL dann einen HTTPS GET Request abschickt?
Ja das ist möglich, aber auch mit WinHttp.au3 in AutoIt. Entweder codest du deine DLL mit C# und der HttpRequest-Klasse (DLL Tutorial für C# findest du in meiner Signatur) oder du verwendest WinHttp.au3 welches viel einfacher ist.
Ich hab dir mal ein Beispiel mit der UDF angehangen (mit HTTPS Beispiel anhand Google); die Calltips findest du irgendwo im Internet.
Genau so eine dll meine ich nur meine Frage ob es den schneller ist mit einer dll oder ob ich es genauso gut in autoit hinkriege
Da AutoIt in diesem Falle auf das WinHttp Objekt zurückgreift, sollte es in etwa gleich schnell sein. Aber der Aufwand mit der DLL ist deutlich höher.
Hallo,
Habe vor einiger Zeit mal was geschrieben was dir bestimmt weiterhilft
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Array.au3>
TCPStartup()
_DownloadBySpeed_SetSpeed(10)
_DownloadBySpeed_GetSpeed()
GUICreate("")
$hSlider = GUICtrlCreateSlider(0, 0, 400, 40)
GUICtrlSetLimit(-1, 1000, 10)
$hProgress = GUICtrlCreateProgress(0, 40, 400, 40)
GUIRegisterMsg($WM_HSCROLL, "WM_HSCROLL")
GUISetState()
_DownloadBySpeed("http://ipv4.download.thinkbroadband.com/5MB.zip", @DesktopDir & "\5mb.zip", _Proc)
ToolTip("Done")
While GUIGetMsg() <> -3
WEnd
Func _Proc($iProc)
Local Static $iLastProc = -1
$iProc = Round($iProc)
If $iProc <> $iLastProc Then
$iLastProc = $iProc
GUICtrlSetData($hProgress, $iProc)
EndIf
EndFunc ;==>_Proc
;===============================================================================
;
; Function Name: _DownloadBySpeed
; Description:: Downloads a file by a selected speed (Select speed via _DownloadBySpeed_SetSpeed($iKbytes)
; Parameter(s): $sUrl: URL to file, sFilePath: FilePath, $sProcFunc: ProgressFunction. formed like this: _Prog($iProg) where $iProg is a number between 0-100
; Requirement(s): TCPStartUp()
; Return Value(s): True if okay, Error if not
; Author(s): GtaSpider//Max Reble
;
;===============================================================================
;
Func _DownloadBySpeed($sUrl, $sFilePath, $sProcFunc = False)
;The smaller the buffersize, the more exact is the speed
;But when the Buffersize is too small, it won't work well on high speed
;For example: 10 kByte is okay for 10-1000 kbyte/s, 1kByte is okay for 1-100 kbyte/s and 100kByte is okay for 100-10000 kbyte/s
Local Const $iBuffer = 10 * 1024
Local $aRegEx, $sIP, $hCon, $hOpen, $vRecv, $fConnected = True, $iFileSize, $iRecvByte, $hTimer
$aRegEx = StringRegExp($sUrl, "^(?:(?:http[s]?|ftp):\/)?\/?([^:\/\s]+)(?::([^\/]*))?((\/\w+)*\/.*?)$", 3);$1: Host, $2: Port, $3: Request
If @error Then Return SetError(@error, 1, 0)
If Not $aRegEx[1] Then $aRegEx[1] = 80
$sIP = TCPNameToIP($aRegEx[0])
If @error Then Return SetError(@error, 2, 0)
$hCon = TCPConnect($sIP, $aRegEx[1])
If @error Then Return SetError(@error, 3, 0)
$hOpen = FileOpen($sFilePath, 2 + 16)
If $hOpen <= 0 Then Return SetError(0xff, 4, 0)
$iFileSize = InetGetSize($sUrl)
[/autoit] [autoit][/autoit] [autoit]TCPSend($hCon, "GET " & $aRegEx[2] & " HTTP/1.1" & @CRLF & "Host: " & $aRegEx[0] & @CRLF & @CRLF)
If @error Then Return SetError(@error, 5, 0)
While $fConnected
$hTimer = TimerInit()
$vRecv = TCPRecv($hCon, $iBuffer, 1)
$fConnected = Not @error
$iRecvByte += BinaryLen($vRecv)
FileWrite($hOpen, $vRecv)
If IsFunc($sProcFunc) Then $sProcFunc(100 * $iRecvByte / $iFileSize)
Sleep(($iBuffer * 1000 / _DownloadBySpeed_GetSpeed()) - TimerDiff($hTimer))
WEnd
FileClose($hOpen)
[/autoit] [autoit][/autoit] [autoit]Return True
EndFunc ;==>_DownloadBySpeed
Func _DownloadBySpeed_SetSpeed($iKbytesSpeed = Null)
Local Static $iSpeed = 0
If $iKbytesSpeed = Null Then
Return $iSpeed
Else
$iSpeed = $iKbytesSpeed * 1024
EndIf
EndFunc ;==>_DownloadBySpeed_SetSpeed
Func _DownloadBySpeed_GetSpeed()
Return _DownloadBySpeed_SetSpeed(Null)
EndFunc ;==>_DownloadBySpeed_GetSpeed
Func WM_HSCROLL($hwnd, $iMsg, $wParam, $lParam)
#forceref $hWnd, $iMsg, $wParam, $lParam
Local Static $hwndSlider = GUICtrlGetHandle($hSlider)
Local $iSlider
If $iMsg = $WM_HSCROLL And $lParam = $hwndSlider Then
$iSlider = GUICtrlRead($hSlider)
ToolTip($iSlider & " kByte/s")
_DownloadBySpeed_SetSpeed($iSlider)
EndIf
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_HSCROLL
Gruß,
Spider
Dein basiert ja auf tcp aber geht Dan in http meins soll rein über tcp laufen, sich über den Client zum Server verbinden
dann lass es halt weg oder sende eine andere anfrage an deinen server. und es läuft garnichts mit http das ist trotzdem nur tcp