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?

Nathan H
la source
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?
Que diriez-vous de ça> github.com/Taymindis/fcgi-function/wiki/…
Oktaheta
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.

Adam Rosenfield
la source
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 :)
Ates Goral
la source
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.

Adam Davis
la source
25

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

Bob Nadler
la source
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.

Éclipse
la source
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

XP1
la source
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
5

J'ai écrit le mien que vous pouvez utiliser. Celui-ci fonctionne avec sqlite, est thread-safe et est en C ++ pour UNIX.

Vous devriez être en mesure de le séparer et d'utiliser le code compatible C.

http://code.google.com/p/mountain-cms/

Daniel A. White
la source
5

Les spécifications HTTP et Firebug m'ont été très utiles lorsque je devais le faire pour mes devoirs.

Bonne chance avec le vôtre. :)

Omer van Kloeten
la source
4

Je suggérerais de regarder la source à quelque chose comme lighthttpd .

garenne
la source
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.

Anjanb
la source
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 .

arul
la source