Construire un serveur HTTP simple en C [fermé]


105

J'ai besoin de créer un serveur HTTP simple en C. Des conseils? Liens? Des échantillons?


1
C'est exactement ce que je pensais
Rik

1
J'ai aussi eu le même problème maintenant. J'ai utilisé ce lien . J'espère que cela vous aidera aussi.
Udara SS Liyanage

1
que diriez-vous de la FAQ sur la façon de poser une question. vous devriez savoir après 3K en représentant que ce n'est pas une vraie question, comment cela peut-il obtenir autant de votes?


1
C'est apparemment une question très utile. Pourquoi est-il fermé?
McBear Holden

Réponses:


85

Je vous suggère de jeter un œil au petit httpd . Si vous voulez l'écrire à partir de zéro, vous voudrez bien lire la RFC 2616 . Utilisez les sockets BSD pour accéder au réseau à un niveau très bas.


2
Ou utilisez inetd et ignorez la partie mise en réseau.
jrockway

22
Ne lisez pas la RFC 2616 maintenant, elle est obsolète par: RFC 7230 , RFC 7231 , RFC 7232 , RFC 7233 , RFC 7234 , RFC 7235
songhir

2
tiny httpdest également sur github ici: github.com/larryhe/tinyhttpd
Purplejacket

119

Je vous recommande de jeter un œil à: Un guide pratique pour écrire des clients et des serveurs

Ce que vous devez implémenter par étapes incrémentielles est:

  1. Faites fonctionner votre couche de sockets TCP de base (écoutez sur le port / les ports, acceptez les connexions client et envoyez / recevez des données).
  2. Implémentez un lecteur tamponné afin que vous puissiez lire les demandes une ligne (délimitée par CRLF) à la fois.
  3. Lisez la toute première ligne. Analysez la méthode, la version de la requête et le chemin.
  4. Implémentez l'analyse de l'en-tête pour la syntaxe «En-tête: valeur». N'oubliez pas de déplier les en-têtes pliés.
  5. Vérifiez la méthode de demande, le type de contenu et la taille du contenu pour déterminer comment / si le corps sera lu.
  6. Implémentez le décodage du contenu en fonction du type de contenu.
  7. Si vous souhaitez prendre en charge HTTP 1.1, implémentez des éléments tels que "100 Continue", un transfert fragmenté.
  8. Ajoutez des mesures de robustesse / sécurité telles que la détection des demandes incomplètes, la limitation du nombre maximum de clients, etc.
  9. Réduisez votre code et ouvrez-le :)

Point # 9, surtout après avoir posé une question ici, +1 :)
Matthieu

26

Un serveur HTTP est conceptuellement simple:

  • Ouvrez le port 80 pour écouter
  • Lorsque le contact est établi, rassemblez un peu d'informations (obtenez principalement - vous pouvez ignorer le reste pour le moment)
  • Traduire la demande en une demande de fichier
  • Ouvrez le fichier et crachez-le sur le client

Cela devient plus difficile en fonction de la quantité de HTTP que vous souhaitez prendre en charge - POST est un peu plus compliqué, les scripts, la gestion de plusieurs requêtes, etc.

Mais la base est très simple.


25

Mongoose (anciennement Simple HTTP Daemon) est plutôt bon. En particulier, il est intégrable et compile sous Windows, Windows CE et UNIX.


12

Ouvrez une socket TCP sur le port 80, commencez à écouter les nouvelles connexions, implémentez ceci . Selon vos objectifs, vous pouvez ignorer presque tout. Au plus simple, vous pouvez envoyer la même réponse pour chaque requête, ce qui implique simplement d'écrire du texte sur le socket.


11

Regardez nweb (Nigel's Web Server), "un petit serveur Web sécurisé [...] avec seulement 200 lignes de code source C":

https://drive.google.com/file/d/0B3msld7qnNOhN1NXaFIwSFU2Mjg/view?usp=sharing http://www.ibm.com/developerworks/systems/library/es-nweb/

L'article comprend un pseudocode, des explications et des commentaires.

EDIT: le lien d'IBM est mort. J'ai enregistré un PDF de la page Web sur Google Drive. Voici le téléchargement du code:

https://drive.google.com/file/d/0B3msld7qnNOhSGZGdDJJMmY0VHM/view?usp=sharing

@ ankushagarwal a apporté quelques modifications et a téléchargé sa version sur GitHub: https://github.com/ankushagarwal/nweb


Eh bien voté sans vérifier le lien: / Je cherche exactement ce que vous avez mentionné, si vous trouvez quelque chose, pouvez-vous me cingler? Txt
samayo

1
Le lien de @samayo IBM est mort. J'ai fourni quelques miroirs.
XP1

Voici un miroir par archive.org - qui, espérons-le, existera dans les années à venir: web.archive.org/web/20140905115151/http://www.ibm.com/…
james246




2

http://www.manning.com/hethmon/ - "Illustrated Guide to HTTP par Paul S. Hethmon" de Manning est un très bon livre pour apprendre le protocole HTTP et sera très utile à quelqu'un qui l'implémente / l'étend.


1

Utilisez les fonctions de socket spécifiques à la plate-forme pour encapsuler le protocole HTTP, comme l'ont fait les gars derrière Apache .


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.