Cree un servidor HTTP simple en C [cerrado]


105

Necesito construir un servidor HTTP simple en C. ¿Alguna guía? ¿Enlaces? Muestras


1
Eso es exactamente lo que pensé
Rik

1
También tuve el mismo problema ahora. Usé este enlace . Espero que esto también te ayude.
Udara SS Liyanage

1
¿Qué tal las preguntas frecuentes sobre cómo hacer una pregunta? debe saber después de 3K en repeticiones que esta no es una pregunta real, ¿cómo puede obtener tantos votos positivos?


1
Aparentemente, esta es una pregunta muy útil. ¿Por qué está cerrado?
McBear Holden

Respuestas:



119

Te recomiendo que eches un vistazo a: Una guía práctica para escribir clientes y servidores

Lo que tiene que implementar en pasos incrementales es:

  1. Ejecute su capa básica de sockets TCP (escuche en el puerto / puertos, acepte conexiones de cliente y envíe / reciba datos).
  2. Implemente un lector almacenado en búfer para que pueda leer las solicitudes una línea (delimitada por CRLF) a la vez.
  3. Lea la primera línea. Analice el método, la versión de la solicitud y la ruta.
  4. Implemente el análisis de encabezado para la sintaxis "Encabezado: valor". No olvide desplegar los encabezados plegados.
  5. Verifique el método de solicitud, el tipo de contenido y el tamaño del contenido para determinar cómo / si se leerá el cuerpo.
  6. Implementar la decodificación de contenido según el tipo de contenido.
  7. Si va a admitir HTTP 1.1, implemente cosas como "100 Continuar", transferencia continua y fragmentada.
  8. Agregue medidas de robustez / seguridad como detectar solicitudes incompletas, limitar el número máximo de clientes, etc.
  9. Envuelva su código y ábralo :)

Punto # 9, especialmente después de publicar una pregunta aquí, +1 :)
Matthieu

26

Un servidor HTTP es conceptualmente simple:

  • Puerto abierto 80 para escuchar
  • Cuando se establezca el contacto, recopile un poco de información (obtenga principalmente; puede ignorar el resto por ahora)
  • Traducir la solicitud en una solicitud de archivo
  • Abra el archivo y escupirlo al cliente.

Se vuelve más difícil dependiendo de la cantidad de HTTP que desee admitir: POST es un poco más complicado, los scripts, el manejo de múltiples solicitudes, etc.

Pero la base es muy sencilla.


25

Mongoose (anteriormente Simple HTTP Daemon) es bastante bueno. En particular, es integrable y se compila en Windows, Windows CE y UNIX.


12

Abra un socket TCP en el puerto 80, comience a escuchar nuevas conexiones, implemente esto . Dependiendo de sus propósitos, puede ignorar casi todo. Como mucho, puede enviar la misma respuesta para cada solicitud, lo que solo implica escribir texto en el socket.


11

Mire nweb (el servidor web de Nigel), "un servidor web pequeño y seguro [...] con sólo 200 líneas de código fuente C":

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

El artículo incluye pseudocódigo, explicaciones y comentarios.

EDITAR: el enlace de IBM ha muerto. He guardado un PDF de la página web en Google Drive. Aquí está la descarga del código:

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

@ ankushagarwal ha realizado algunos cambios y ha subido su versión a GitHub: https://github.com/ankushagarwal/nweb


Eh votó sin verificar el enlace: / Estoy buscando exactamente lo que mencionaste, si encuentras algo, ¿puedes enviarme un ping? Txt
samayo

1
El enlace de @samayo IBM ha muerto. He proporcionado algunos espejos.
XP1

Aquí hay un espejo de archive.org, que con suerte estará disponible en los próximos años: web.archive.org/web/20140905115151/http://www.ibm.com/…
james246




2

http://www.manning.com/hethmon/ - "Guía ilustrada de HTTP por Paul S. Hethmon" de Manning es un muy buen libro para aprender el protocolo HTTP y será muy útil para alguien que lo implemente / amplíe.


1

Use funciones de socket específicas de la plataforma para encapsular el protocolo HTTP, tal como lo hicieron los chicos detrás de Apache .


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.