web-dev-qa-db-fra.com

Construire un serveur HTTP simple en C

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

103
Nathan H

Je vous suggère de jeter un oeil à minuscule httpd . Si vous voulez l'écrire à partir de zéro, alors vous voudrez complètement lire RFC 2616 . Utilisez prises BSD pour accéder au réseau à un niveau très bas.

82
Adam Rosenfield

Je vous conseillerais de consulter: Guide pratique pour écrire des clients et des serveurs

Ce que vous devez implémenter par étapes est la suivante:

  1. Obtenez votre couche de base TCP sockets en cours d'exécution (écoutez sur les ports, acceptez les connexions client et envoyez/recevez des données)).
  2. Implémentez un lecteur mis en mémoire tampon afin de pouvoir lire les demandes une ligne (délimitées par CRLF) à la fois.
  3. Lire la toute première ligne. Analyser la méthode, la version de la demande et le chemin.
  4. Implémenter une analyse d'en-tête pour la syntaxe "Header: value". N'oubliez pas de déplier les en-têtes pliées.
  5. Vérifiez la méthode de requête, 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 envisagez de prendre en charge HTTP 1.1, implémentez des éléments tels que "100 Continuer", transfert en mode persistant et fragmenté.
  8. Ajoutez des mesures de robustesse/sécurité telles que la détection des demandes incomplètes, la limitation du nombre maximal de clients, etc.
  9. Rétractez votre code et ouvrez-le :)
116
Ates Goral

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 l'instant)
  • Traduire la demande en demande de fichier
  • Ouvrez le fichier et recrachez-le chez 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 demandes, etc.

Mais la base est très simple.

26
Adam Davis

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

25
Bob Nadler

Ouvrez un TCP socket sur le port 80, commencez à écouter de nouvelles connexions, implémentez this . Selon vos objectifs, vous pouvez presque tout ignorer. Au plus simple, vous pouvez envoyer la même réponse pour chaque demande, ce qui implique simplement l'écriture de texte dans le socket.

12
Eclipse

Regardez nweb (serveur Web de Nigel), "un petit serveur Web sûr [...] 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 code à télécharger:

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

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

11
XP1

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

Vous devriez pouvoir le distinguer et utiliser le code compatible C.

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

5
Daniel A. White

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

Bonne chance avec le tien. :)

5
Omer van Kloeten

Je suggère de regarder la source à quelque chose comme lighttpd .

4
warren

http://www.manning.com/hethmon/ - "Le Guide illustré sur 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. mise en œuvre/extension.

2
anjanb

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

1
arul

Il y a un dupliquer avec plus de réponses .

Un candidat non encore mentionné est spserver .

1
akauppi