Seite 1 von 1

Downloadgeschwindigkeit Festlegen

Verfasst: 15.01.2006 23:45
von zigapeda
Hi

ich möchte ein programm schreiben, welches dateien aus dem internet runterläd, diese zusammen setzt und dann als eine datei speichert.
Das ist alles kein Problem, nur möchte ich das Downloaden gerne im hintergrund laufen lassen und dabei nicht die ganze verbindung dicht machen.

Das was ich runterladen möchte, sind teile einer exe datei die dann später wieder zu einer exe datei zusammen gefügt werden sollen. Diese exe ist noch nicht fest, was das für eine werden soll, weil ich möchte das programm für mehrere andere programme einsetzen, um sie upzudaten.

Ich würde gerne das HTTP Protokoll zum Runterladen verwenden oder gibt es ein anderes Protokoll mit dem ich die DL geschwindigkeit einfacher festlegen kann?

Schon mal Danke im Vorraus.

Edit: was ich vieleicht auch noch dazu sagen sollte ist, das es auch unter Linux laufen muss also keine APIs...

Verfasst: 16.01.2006 06:07
von Hroudtwolf
Dazu brauchst du keine API.
Du musst halt in Blöcken runterladen.

Ich hab dir hier mal eine Procedure gebastelt.

Code: Alles auswählen

Procedure SendDownloadRequest (ClientID.l,DeineDatei.s,DeineIP.s)
  header.s="GET "+DeineDatei.s+" HTTP/1.1"
  header.s+"Host: "+DeineIP.s
  header.s+"User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE; rv:1.7.12) Gecko/20050919 Firefox/1.0.7"
  header.s+"Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"
  header.s+"Accept-Language: de,de-de;q=0.5"
  header.s+"Accept-Encoding: gzip,deflate"
  header.s+"Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7"
  header.s+"Keep-Alive: 300"
  header.s+"Connection: keep-alive"
  SendNetworkString (ClientID.l,header.s)
EndProcedure 
Die Procedure sendet einen HTTP-Request an einen Server.
Darauf hin müsste eine Datei eintreffen.
Das merkt dein Downloadclient anhand des NetworkEvents 2.
Du musst dann wenn ich mich nicht irre einfach bei ReceiveNetworkData(ConnectionID, *DatenBuffer, Länge) die Länge deiner maximalen Blockgrösse angeben und eine Ladeschleife einrichten.

Verfasst: 16.01.2006 07:29
von HeX0R
Den obigen Aufruf solltest du allerdings vor der Threaderstellung aufrufen, da er wie du siehst einen String verwendet.

Im Thread ist es dann recht simpel, wie Hroudwolf schon sagte:

Du liest beispielsweise Blöcke von 4096Byte Grösse und machst einen Delay(1000) in die Schleife.
Das wäre dann in etwa 4k/sec.

Verfasst: 16.01.2006 08:56
von Tafkadasom2k5
Ja, aber ich glaube, dass nicht die Frage war, wie man einen HTTP-Get Befehl einrichtet (obwohl ich das auch noch nicht wusste, und verdammt interessant finde ;) ), sondern wie man diese "Ladeschleife" einrichtet.
Wenn man den "HTTP-Get" Befehl mit dem "buffer" begrenzt, dann läd er doch immer wieder den "ersten Teil" runter.Oder verstehe ich da was an dem Prinzip falsch?

Wenn ich 5 Blöcke runterladen möchte, und die Procedure von Hroudtwolf inner For-Schleife 5 mal mache, dann fängt er dcch 5 mal NEU an...

Gr33tz
Tafkadasom2k5

P.S.: Wenn das völliger Murks ist, was ich hier schreibe und was meine Bedenken sind, dann klärt mich bitte auf-bin auf dem HTTP-Gebiet relaitver N00b und fange auch gerade erst an, mich mit diesem Stoff zu beschäftigen.
Desto mehr ich weiß, desto besser wird mein kleines CGI-Script schließlich werden (siehe anderer Thread)

Verfasst: 16.01.2006 13:31
von stbi
@tafkadasom: die Schleife ist für ReceiveNetworkData gedacht, der http-Request wird nur einmal abgesetzt

Verfasst: 16.01.2006 19:36
von zigapeda
hmm
so wie ich das jetzt verstanden habe, lade ich die daten mit receivenetworkdata() runter oder?
Weil ich dachte jetzt das sich die Daten bereits in meinem arbeitsspeicher befinden wenn NetworkClientEvent() 2 zurück gibt und ich sie dann mit ReceiveNetworkData() aus dem Arbeitsspeicher lade.
Aber schon mal danke für die Hilfe :allright: