2010-10-25 4 views
6

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 

+1

Que diriez-vous RFC2616 http://tools.ietf.org/html/rfc2616#section-8.1? –

+0

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). –

+0

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

Répondre

1

je recommande saisir la source d'Apache et de voir comment ils gèrent cela. Il n'y a pas beaucoup de points dans le code Psuedo quand vous pouvez voir comment fonctionne la vraie chose.

+0

Les grands esprits se ressemblent ? ;) – alex

+0

nos réponses doivent avoir passé dans les tubes :) –

1

Peut-être que vous pourriez regarder Apache's code pour quelques indices. Il est écrit en C.

Espérons que quelqu'un va venir et donner une réponse plus détaillée :)

+0

J'essaie d'éviter cela autant que possible. J'ai commencé l'autre jour, mais filtrer des choses que je n'ai pas besoin de savoir en ce moment des choses dont j'ai besoin prend beaucoup de temps. – Wolftousen

2

Je recommande regarder GNU libmicrohttpd. Il se concentre directement sur la fourniture d'un cadre sur lequel construire des serveurs HTTP 1.1. Il est petit et soutient keep-alive avec et sans filetage. (Personnellement, je l'utilise sans filetage.)

Même si vous décidez d'écrire votre serveur Web à partir de zéro, je suggère de regarder libmicrohttpd pour avoir un aperçu non seulement de la façon dont le protocole fonctionne, mais comment la bibliothèque modélise "le flux de travail" d'un serveur web d'une manière très propre. Je pense que c'est une erreur d'imaginer que keep-alive implique le threading et je pense que c'est un obstacle à la compréhension keep-alive.

(En ce qui concerne les crédits d'Apaches comme un serveur web, il est assez énorme, et il y a un beaucoup là ne sont pas liées à des protocoles, mais plutôt des choses comme son système de plug-in et ainsi de suite.)

+0

Merci, je vais examiner cela après que je sois au chômage aujourd'hui. – Wolftousen