Je m'intéresse aux principes de base des serveurs Web, comme Apache ou Nginx, alors maintenant je développe mon propre serveur.Est-il possible d'écrire directement à partir du fichier sur le socket?
Lorsque mon serveur reçoit une requête, il recherche un fichier (par exemple, index.html
), s'il existe - il lit tout le contenu dans le tampon (content
) et l'écrit sur le support après. Voici un code simplifié:
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;
}
}
La question est assez simple: est-il possible d'éviter d'utiliser le tampon et écrire le contenu de fichiers directement sur la prise?
Merci pour tous les conseils :)
Je ne l'ai jamais utilisé donc je ne veux pas écrire une réponse, mais jetez un oeil à [ 'splice'] (https://linux.die.net/ man/2/épissure). L'idée ici est de faire un transfert de zéro copie, ce qui vous permettra au moins de gagner du temps en copiant les données du fichier dans l'espace utilisateur, puis de redescendre à l'espace du noyau avant de l'atteindre. Vous pouvez google plus sur les concepts de zéro-copie, et il y a un échange informatif d'email de Linus quelque part en parlant de 'splice'. Je parle ici de Linux, je ne suis pas sûr de l'équivalent de Microsoft ou des autres. – yano
@yano 'splice' est très cool et général mais dans le cas spécifique d'envoyer un fichier sur un socket,' sendfile' est plus facile et légèrement plus efficace, je crois. – rici
@rici ah oui, je suis d'accord ,, plus facile certainement.Je suppose que 'sendFile' utilise' splice' sous le capot (pour Linux de toute façon), mais je ne sais pas. – yano