11 Stimmen

Implementierung eines Download-Managers, der die Wiederaufnahme unterstützt

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?

0voto

Es scheint mir, dass Sie die Größe pro Download-Chunk begrenzen wollen. Große Pakete könnten Sie dazu zwingen, das Herunterladen von Daten zu wiederholen, wenn die Verbindung kurz vor dem Ende des Datenteils abbricht. Vor allem ein Problem mit langsameren Verbindungen.

0 Stimmen

Sie könnten die bereits erhaltenen Daten speichern und nur die nicht erhaltenen anfordern - wenn z. B. ein 100-MB-Chunk bei 95 MB abbricht, werden bei der nächsten Anforderung die letzten 5 MB statt des gesamten Chunks angefordert.

0voto

Giorgio Gambino Punkte 956

Für die Unterstützung von Pausenfortsetzungen sehen Sie sich dieses einfache Beispiel an Einfacher Download-Manager in Qt mit Unterstützung von Puase/Resume

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X