Ich muss (als Aufgabe) einen kleinen HTTP/1.0-Server in C schreiben.HTTP/1.0 Server in C, wie große Dateien an den Client senden?
Hier ist mein Problem: Ich weiß nicht, wie mit dem Fall umzugehen, in dem die vom Client angeforderte Seite sehr groß ist .
Ich dachte, dass es besser wäre, zuerst die ganze Datei zu lesen und dann die Antwort (einschließlich Statuszeile und Header) an den Client zu senden, der Hauptgrund dafür ist, dass ich den Statuscode entsprechend einstellen kann. Zum Beispiel sagen, dass, während der Server bereits gelesen hat und als String die Hälfte der Datei, die der Client will, read()
scheitert. Ich würde dann weitermachen und "HTTP/1.0 500 Interner Serverfehler" als Statuszeile setzen. Das Problem mit diesem Ansatz ist, dass es zu viel Speicher benötigt, wenn die Datei groß ist (und da jede Verbindung von einem separaten Thread behandelt wird, wenn mehrere Threads Dateien mit beträchtlichen Dimensionen als String speichern würden, würde die Speicherbelegung verwendet werden) noch schlimmer werden).
Als Lösung dachte ich über das Öffnen der Datei, das Senden der Statuszeile und der Header, dann in einen Puffer eine bestimmte Menge (nicht zu groß) von Bytes lesen und iterativ senden, was im Puffer ist, bis ich gelesen habe/sendete die ganze Datei.
Dies löst das Problem, aber wieder, was ist, wenn read()
schlägt fehl, während ich die Datei zur Hälfte bin? Die Client-Anfrage konnte wegen eines internen Fehlers nicht ausgeführt werden, daher wäre ein 500er Status-Code angebracht, aber ich habe bereits eine 200 OK-Nachricht über den Socket gesendet!
Wie wird dieses Problem normalerweise in HTTP-Servern behandelt?
Welchen Fehler erwarten Sie, dass 'read()' auftritt, nachdem Sie 'read()' bereits erfolgreich in derselben Datei aufgerufen haben? Der einzige, den ich in der Praxis sehen kann, ist EINTR, was harmlos ist. Abhängig von Ihrer Plattform haben Sie möglicherweise auch bessere Optionen wie 'sendfile()'. – EOF