Desarrollo web C ++: querer un comienzo minimalista [cerrado]


8

Actualmente estoy trabajando en una licenciatura en Ciencias de la Computación, y quiero construir mi propia biblioteca de Servidor Web. ¿El problema? Cada búsqueda que he realizado para interactuar con sitios web apunta a "Usar esta biblioteca que fue construida por otra persona", en lugar de explicar los conceptos básicos de enviar y recibir información.

No estoy pidiendo mucho: solo quiero ingresar un solo carácter alfanumérico en una página web, presionar un botón y enviar ese byte de información a un programa C ++, sin la ayuda de un estándar biblioteca.


3
¿Ha considerado apache (o la mayoría de los servidores web) y la interfaz de puerta de enlace común ? ¿O apache con un complemento de c ++ ( tutoriales asociados )?

Otra sugerencia sería Mongrel 2. Simplemente envía solicitudes al programa de destino y recibe la salida a través de sockets ZeroMQ.
Será el

También hay un aumento de ASIO si realmente quieres comenzar bajo nivel
Daniel Gratzer

Esto REALMENTE debería trasladarse a stackoverflow.com
botas de goma

Respuestas:


6

Boost.Asio se está convirtiendo actualmente en (¿una de las?) La futura forma estándar de C ++ de hacer redes. (Aquí está uno de los documentos: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3388.pdf )

Es realmente el sistema de comunicación asíncrono portátil más básico que encontrará utilizando C ++ moderno , ya que abstrae otras bibliotecas de sockets o plataformas proporcionadas.

Todas las bibliotecas modernas de redes http C ++ ( CppNetlib y CPPCMS ) se basan en él. Le sugiero que cree su biblioteca en torno a ella, proporcione los conceptos básicos para sockets y comunicación asincrónica (y sincrónica), pero no configure un sistema completo para usted. Tal vez en unos años incluso pueda reemplazar Boost.ASIO por el equivalente estándar de C ++.

Además, la documentación de Boost.Asio proporciona información sobre cómo funciona la comunicación en este tipo de contexto. Por lo tanto, leerlo podría responder muchas de sus preguntas.

Y si quieres entender el nivel inferior, lee el código Asio. Es un poco difícil de leer si no estás acostumbrado a la metaprogramación de C ++ y otros modismos de C ++, pero aprenderías mucho al leerlo.


2

Parte de la información que desea está aquí: http://en.wikipedia.org/wiki/Common_Gateway_Interface . Puede que no parezca que lo que intentas hacer es muy complicado, pero es un poco más complicado de lo que piensas. Como dijo Dominic, la parte difícil será abrir el puerto y leer desde el socket, bastante difícil en c ++ land.

Para empezar, recomendaría usar un servidor web existente y escribir su propio módulo CGI. El servidor web se encargará del lado de los sockets, y básicamente solo está leyendo datos de variables de entorno o argumentos de línea de comandos (si es una solicitud GET) o del stdin si es una POST (creo que son datos de mi memoria que tiene unos 15 años). Lo que quieres es algo como esto:

#include <stdio.h>
#include <string.h>

int main(){
    char *s=getenv("CONTENT_LENGTH");
    int i=atoi(getenv("CONTENT_LENGTH"));
    printf("Content-type: text/html\n\n");
    printf("%s\n<br />",s); //Shows you CONTENT_LENGTH works
    printf("%d\n<br />",i); //Shows you it was converted to int
    char *tmp = new char[100];
    fread(tmp,i,1,stdin); //read from stdin something of i bytes to tmp
    printf("%s\n<br />",tmp);
    return 0;
}

Por cierto, como una lección para el lector, esta aplicación tiene un error de desbordamiento de búfer. Probablemente quieras arreglar eso :)


1

Corríjame si me equivoco, pero parece que desea programar su propio servidor web desde cero, utilizando solo componentes estándar de C ++.

En primer lugar, está un poco en apuros ya que no hay una biblioteca de socket tcp / ip estándar, por lo que deberá usar sockets de Windows o Posix dependiendo de la plataforma.

Luego deberá investigar el formato de las solicitudes / respuestas. Estoy seguro de que con un poco de búsqueda encontrarás un recurso en el protocolo http.

Después de eso, deberá crear un servidor que escuche las conexiones, responda a las solicitudes y envíe las respuestas.

Si eso no es lo que estás preguntando, entonces la sugerencia de MichaelT suena razonable.

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.