2010-05-06 6 views
7

Wie kann ein HTTP-Server Daten über mehrere Pakete senden?HTTP Daten Chunks über mehrere Pakete?

Zum Beispiel möchte ich eine Datei übertragen, das erste Paket I senden ist:

HTTP/1.1 200 OK 
Content-type: application/force-download 
Content-Type: application/download 
Content-Type: application/octet-stream 
Content-Description: File Transfer 
Content-disposition: attachment; filename=test.dat 
Content-Transfer-Encoding: chunked 

400 
<first 1024 bytes here> 

400 
<next 1024 bytes here> 

400 
<next 1024 bytes here> 

Jetzt muß ich ein neues Paket machen, wenn ich nur an:

400 
<next 1024 bytes here> 

ganze Clients schließen dort Verbindungen auf mich und die Dateien werden gekürzt.

Welche Header setze ich in ein zweites Paket, um mit dem Datenstrom weiterzumachen?

+0

versuchen Sie einen Webserver zu implementieren oder zu fälschen? – dlamotte

+0

Also, was meinst du mit Paket? Ein IP-Paket? Ein TCP-Segment? – WhirlWind

+0

Ahh, anscheinend meinst du Brocken ... verwirrend. Brocken haben wirklich nichts mit Paketen zu tun. – WhirlWind

Antwort

3

Mein Mangel an Rep scheint mir nicht erlauben, die Frage zu kommentieren, nur beantworten, so nehme ich an, dass etwas wie "Sie versuchen, HTTP 1.1 auf dem Webserver eines eingebetteten Geräts zu implementieren Das hat einen paketorientierten Netzwerk-Stack statt eines Stream-orientierten "ist wahr, oder Sie würden nicht über Pakete sprechen. (Wenn Sie über Stücke sprechen, sehen Sie andere Antworten.)

Gegeben, dass - verwenden Sie Sockets, wenn Sie können; Sie sollten nicht in Paketen denken müssen. Wahrscheinlich gibt es irgendwo einen Wrapper für Ihren Netzwerk-Stack. Wenn nicht, schreibe einen, der deine Leistung nicht zu sehr in Anspruch nimmt.

Wenn Sie nicht können, aus irgendeinem Grund - Sie sind wahrscheinlich die Größe des ersten Pakets ausblasen. Ihre MTU ist wahrscheinlich so etwas wie 1500 oder 1492 (oder kleiner), und Sie haben + 5 + 1024 + 5 + 1024 + 5 + 1024 Bytes aufgelistet "in Ihrem ersten Paket." Ihr Netzwerk-Stack kann genug saugen, dass er Ihnen keine Fehlercodes gibt, oder Ihr Code überprüft sie möglicherweise nicht - oder er tut etwas anderes nutzlos.

+0

Danke, tatsächlich war das Problem im Netzwerkstack auf der TCP-Schicht. Aus irgendeinem Grund nahm es sich vor, die TCP-Verbindung nach ACK-Paketen zu beenden. Ich habe einen neuen TCP-Stack von einem anderen Anbieter installiert und die Dinge funktionieren gut. – myforwik

+0

Und deshalb, wenn Sie Linux in etwas stopfen können, sollten Sie wirklich. Buggy Embedded Zeug ist der Fluch meiner Existenz. –

3

HTTP hat keine Ahnung von Paketen. Ihr HTTP-Stream könnte sogar in 1-Byte-Pakete aufgeteilt werden.

Für die Chunked-Codierung müssen Sie die erforderlichen Header für jeden Chunk angeben (der keine Auswirkungen auf Pakete hat), wie im RFC angegeben.

+0

He ** ist ** die erforderlichen Chunk-Header angeben? 1024 KB ist hex 400. "Content-Transfer-Encoding" sollte jedoch 'Transfer-Encoding' sein. – BalusC

+0

Sie haben Recht. Das Problem lag in der TCP-Schicht und nicht im HTTP-Informationsstrom. Vielen Dank. – myforwik

2

Zuerst wird der Header Sie wollen, ist

Transfer-Encoding: chunked 

nicht Content-Transfer-Encoding.

Warum senden Sie auch drei verschiedene Content-Type Header?

2

Normalerweise würden Sie die Header Accept-Ranges und Content-Range von der Server-Seite aus verwenden, um den Client zu benachrichtigen, dass der Server die Wiederaufnahme annimmt. Der Client sendet dann den Header Range zurück, um den partiellen Download anzufordern.

Da der Header Content-Range eine Vorstellung von der vollen Dateilänge erfordert und dies hier unbekannt erscheint (sonst gab es überhaupt keinen Grund für chunked Kodierung zu wählen), sind Sie in Bezug auf die Standard-HTTP-Spezifikation verloren. Sie werden entweder ein anderes Protokoll wählen oder Ihre eigene Spezifikation erstellen oder nach alternativen Wegen suchen, um die Länge des Inhalts im Voraus herauszufinden.


Das heißt, die drei Content-Type Header macht keinen Sinn. Wähle ein. Auch die Content-Transfer-Encoding ist falsch, es sollte Transfer-Encoding gewesen sein.

+0

Die seltsamen eingebetteten Clients sagen, dass sie diese Header benötigen, um die Dateien speichern zu können ... wer weiß warum. Resume wäre eine nette Funktion, die ich unterstütze, daher werde ich auf jeden Fall in die Bereiche schauen. – myforwik