Downloadgeschwindigkeit Festlegen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
zigapeda
Beiträge: 1753
Registriert: 06.03.2005 17:22
Wohnort: Kaufbeuren
Kontaktdaten:

Downloadgeschwindigkeit Festlegen

Beitrag 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...
kluger Mann + kluge Frau = Romanze | dummer Mann + dumme Frau = Schwangerschaft
kluger Mann + dumme Frau = Affäre | dummer Mann + kluge Frau = Shopping <)
Benutzeravatar
Hroudtwolf
Beiträge: 1416
Registriert: 30.10.2004 23:33
Kontaktdaten:

Beitrag 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.
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag 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.
Benutzeravatar
Tafkadasom2k5
Beiträge: 1578
Registriert: 13.08.2005 14:31
Kontaktdaten:

Beitrag 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)
OpenNetworkConnection() hat geschrieben:Versucht eine Verbindung mit dem angegebenen Server aufzubauen. 'ServerName$' kann eine IP-Adresse oder ein voller Name sein (z.B.: "127.0.0.1" oder "ftp.home.net").
php-freak hat geschrieben:Ich hab die IP von google auch ned rausgefunden!
Benutzeravatar
stbi
Beiträge: 685
Registriert: 31.08.2004 15:39
Wohnort: Cleverly Hills

Beitrag von stbi »

@tafkadasom: die Schleife ist für ReceiveNetworkData gedacht, der http-Request wird nur einmal abgesetzt
PB 4.02 XP Pro SP2 "Der Code ist willig, aber der Prozessor ist schwach."

Es gibt keine Vista-Witze. Es ist alles wahr!
Benutzeravatar
zigapeda
Beiträge: 1753
Registriert: 06.03.2005 17:22
Wohnort: Kaufbeuren
Kontaktdaten:

Beitrag 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:
kluger Mann + kluge Frau = Romanze | dummer Mann + dumme Frau = Schwangerschaft
kluger Mann + dumme Frau = Affäre | dummer Mann + kluge Frau = Shopping <)
Antworten