Ich habe vor, einen kleinen Download-Manager in C++ zu schreiben, der die Wiederaufnahme (und mehrere Verbindungen pro Download) unterstützt.
Nach den Informationen, die ich bisher gesammelt habe, muss ich beim Senden der HTTP-Anfrage ein Header-Feld mit dem Schlüssel "Range" und dem Wert "bytes=startoff-endoff" hinzufügen. Dann gibt der Server eine HTTP-Antwort mit den Daten zwischen diesen Offsets zurück.
So grob, was ich im Sinn haben, ist die Datei auf die Anzahl der zulässigen Verbindungen pro Datei zu teilen und senden Sie eine http-Anfrage pro aufgeteilten Teil mit dem entsprechenden "Bereich". Wenn ich also eine 4 MB große Datei und 4 erlaubte Verbindungen habe, würde ich die Datei in 4 Teile aufteilen und 4 http-Anfragen senden, jede mit dem entsprechenden "Range"-Feld. Bei der Implementierung der Fortsetzungsfunktion würde man sich merken, welche Offsets bereits heruntergeladen wurden, und diese einfach nicht anfordern.
- Ist dies der richtige Weg?
- Was ist, wenn der Webserver die Wiederaufnahme nicht unterstützt? (ich vermute, er wird den "Bereich" ignorieren und einfach die gesamte Datei senden)
- Sollte ich beim Senden der http-Anfragen im Bereich die gesamte aufgeteilte Größe angeben? Oder vielleicht fragen kleinere Stücke, sagen wir 1024k pro Anfrage?
- Wenn ich die Daten lese, sollte ich sie sofort in die Datei schreiben oder eine Art von Pufferung vornehmen? Ich denke, es könnte verschwenderisch sein, kleine Stücke zu schreiben.
- Sollte ich eine Memory-Mapped-Datei verwenden? Wenn ich mich richtig erinnere, wird sie eher für häufiges Lesen als für Schreiben empfohlen (ich könnte mich irren). Ist das vom Speicher her sinnvoll? Was ist, wenn ich mehrere Downloads gleichzeitig habe?
- Wenn ich keine speicherabbildende Datei verwende, sollte ich die Datei für jede zulässige Verbindung öffnen? Oder soll ich, wenn ich in die Datei schreiben muss, einfach suchen? (Wenn ich eine Memory-Mapped-Datei verwenden würde, wäre dies wirklich einfach, da ich einfach mehrere Zeiger haben könnte).
Hinweis: Ich werde wahrscheinlich Qt verwenden, aber dies ist eine allgemeine Frage, so dass ich Code aus ihm herausgelassen.
7 Stimmen
Ich bin mir durchaus bewusst, dass es Dutzende von Download-Managern gibt, aber Sie verfehlen irgendwie den Punkt. Wenn jeder nach dieser Philosophie vorgehen würde, hätten wir 1 Programmiersprache, 1 Betriebssystem, 1 Browser, nun, Sie verstehen schon.
0 Stimmen
Beachten Sie, dass ich eine Frage gestellt habe, die Sie nicht beantwortet haben. Was war der Grund? Spaß? Fehlende Funktionen? Was?
2 Stimmen
Alle, schätze ich. ist das wirklich wichtig?