Ich interessiere mich für die Grundprinzipien von Web-Servern, wie Apache oder Nginx, also entwickle ich jetzt meinen eigenen Server.Kann ich direkt aus der Datei in den Socket schreiben?
Wenn mein Server eine Anfrage erhält, sucht es nach einer Datei (z. B. index.html
), wenn es existiert - lesen Sie den gesamten Inhalt in den Puffer (content
) und schreiben Sie es in den Socket nach. Hier ist ein vereinfachter Code:
int return_file(char* content, char* fullPath) {
file = open(fullPath, O_RDONLY);
if (file > 0) { // File was found, OK
while ((nread = read(file, content, 2048)) > 0) {}
close(file);
return 200;
}
}
Die Frage ist ziemlich einfach: ist es möglich, zu vermeiden, Puffer und Dateiinhalt direkt an die Buchse schreiben?
Vielen Dank für alle Tipps :)
ich habe es nie benutzt, so will ich nicht eine Antwort schreiben, aber einen Blick auf [ 'splice'] nehmen (https://linux.die.net/ Mann/2/Spleiß). Die Idee hier ist, eine Nullkopie-Übertragung durchzuführen, die Ihnen zumindest die Zeit des Kopierens der Dateidaten in den Benutzerbereich und dann zurück in den Kernelraum spart, bevor sie an den Socket gelangt. Sie können google mehr über Zero-Copy-Konzepte googeln, und es gibt einen informativen E-Mail-Austausch von Linus irgendwo da draußen sprechen über 'splice'. Ich rede hier von Linux, ich bin mir nicht sicher, was das Äquivalent von Microsoft oder anderen ist. – yano
@yano 'splice' ist sehr cool und allgemein, aber im speziellen Fall des Sendens einer Datei an einen Socket ist' sendfile' einfacher und etwas effizienter, glaube ich. – rici
@rici ah ja, ich stimme zu, einfacher sicherlich.Meine Vermutung ist, dass "sendFile" 'Spleiß 'unter der Haube verwendet (für Linux sowieso), aber ich weiß es nicht. – yano