Je tente d'écrire mon propre serveur http 1.1, juste pour m'amuser et en apprendre davantage sur le protocole HTTP, les sockets et les threads.Programmation de serveur HTTP
J'ai eu un bon début je pense avec seulement fournir des pages statiques (en utilisant c, que je préférerais rester pour le moment). J'ai une page de test que j'ai écrite il y a un moment et je livre environ 50 fichiers en 124ms selon le chrome, sans utiliser de threads ou de sockets keep-alive.
J'ai trouvé très difficile de faire fonctionner le threading/keep-alive. Il y a peu ou pas de ressources sur le web (que je peux trouver dans mes heures de googling) qui expliquent les connexions keep-alive en détail. Si quelqu'un pouvait recommander un bon livre sur la programmation du serveur HTTP, je l'apprécierais grandement.
J'ai déjà fait du threading et de la programmation de socket en créant un simple programme de chat, donc j'ai au moins une certaine expérience. Le problème que je rencontre est que lorsque je tente d'incorporer des threads, le navigateur client configure plusieurs connexions. Quelque part le long de la ligne, le serveur devient confus et le client reste là à attendre des réponses et le serveur arrête de faire quoi que ce soit. J'envoie l'en-tête Connection: Keep-Alive, mais cela ne change rien et quand j'incorpore keep-alive et crée une boucle pour obtenir des requêtes dans la fonction threadée, elle stalle jusqu'à ce que la connexion soit fermée.
J'apprécierais que quelqu'un puisse me donner un pseudo code sur la façon de rester actif/threading travaillant pour que le client arrête de créer plusieurs connexions à la fois.
Une brève description de ce qui se passe:
main function
load in static pages to large array of fileinfo struct that hold the file data and length
create the socket
set it to listen to port 80
set it to listen for 10 connections at a time(i know this is low...)
start an endless loop
block while waiting for someone to connect
check if it's a localhost connection
shutdown the server
otherwise
start a thread(with pthread), sending it the socket variable
loop
Thread Function
setsock opt for 3 sec timeout on send/recv and enable Keep-alive
start endless loop
read in request
if request timed out, break the loop
Validate Request function call
Create Reponse function call
Send response
if request contained Connection: close header break the loop
loop
close socket
return
Que diriez-vous RFC2616 http://tools.ietf.org/html/rfc2616#section-8.1? –
Etes-vous sûr que c'est un problème lié au threading? Aussi définissez-vous l'en-tête Content-Length? Je pense que c'est nécessaire pour que le travail continue (sauf si vous utilisez le découpage). –
J'utilise aussi l'en-tête content-length et j'envoie la bonne taille pour chaque message. La seule raison pour laquelle je dis que c'est lié au thread est que je n'ai aucun problème jusqu'à ce que je commence à utiliser des threads. Si j'essaye d'implémenter keep-alive sans threads, il faut juste que la page soit livrée pour toujours. – Wolftousen