Desenvolvimento Web C ++: Desejando um início minimalista [fechado]

8

Atualmente, estou trabalhando em um curso de Ciência da Computação e quero construir minha própria biblioteca de servidores Web. O problema? Todas as pesquisas que fiz sobre a interação com sites apontam para "Use esta biblioteca criada por outra pessoa" - em vez de explicar os conceitos básicos de envio e recebimento de informações.

Não estou pedindo muito - só quero inserir um único caractere alfanumérico em uma página da Web, pressionar um botão e enviar um byte de informação para um programa C ++, sem a ajuda de um padrão não padrão. biblioteca.

Christopher Ivey
fonte
3
Você já considerou o apache (ou quase qualquer outro servidor web) e a interface de gateway comum ? Ou apache com um plugin c ++ ( tutoriais associados )?
Outra sugestão seria o Mongrel 2. Ele apenas envia solicitações ao programa de destino e recebe a saída através dos soquetes ZeroMQ.
Will
Há também impulsionar ASIO se você realmente quer começar de baixo nível
Daniel Gratzer
Isso realmente deve ser movido para stackoverflow.com
rubber boots

Respostas:

6

No momento, o Boost.Asio está sendo convertido para ser (uma das?) A futura maneira padrão de C ++ de fazer networking. (Aqui está um dos artigos: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3388.pdf )

É realmente o sistema de comunicação assíncrona portátil mais básico que você encontrará usando o C ++ moderno , pois abstrai outras bibliotecas de soquetes ou plataformas fornecidas.

Todas as modernas bibliotecas de rede http C ++ ( CppNetlib e CPPCMS ) dependem disso. Sugiro que você construa sua biblioteca em torno dela, fornecendo noções básicas para soquetes e comunicação assíncrona (e síncrona), mas não configure um sistema completo para você. Talvez em alguns anos você possa até substituir o Boost.ASIO pelo equivalente padrão do C ++.

Além disso, a documentação do Boost.Asio fornece informações sobre como a comunicação funciona nesse tipo de contexto. Portanto, a leitura pode responder a muitas de suas perguntas.

E se você quiser entender o nível mais baixo, leia o código do Asio. É um pouco difícil de ler se você não está acostumado à metaprogramação em C ++ e a outros idiomas em C ++, mas aprenderia muito lendo isso.

Klaim
fonte
2

Algumas das informações que você deseja estão aqui - http://en.wikipedia.org/wiki/Common_Gateway_Interface . Pode não parecer que o que você está tentando fazer seja muito complicado, mas é um pouco mais complicado do que você imagina. Como Dominic disse, a parte complicada será abrir a porta e ler do soquete - bastante difícil em c ++ land.

Eu recomendaria que, para começar, use um servidor web existente e escreva seu próprio módulo CGI. O servidor da Web cuidará do lado dos soquetes, e basicamente você está apenas lendo dados de variáveis ​​de ambiente ou argumentos de linha de comando (se for uma solicitação GET) ou do stdin se for um POST (acho que são dados da minha memória que tem cerca de 15 anos). O que você quer é algo como isto:

#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;
}

BTW como uma lição para o leitor, esta aplicação possui um erro de estouro de buffer. Você provavelmente deseja corrigir isso :)

Rocklan
fonte
1

Corrija-me se estiver errado, mas parece que você deseja programar seu próprio servidor da Web do zero, usando apenas componentes C ++ padrão.

Antes de tudo, você está um pouco confuso, pois não há uma biblioteca de soquetes tcp / ip padrão; portanto, você precisará usar soquetes do Windows ou Posix, dependendo da plataforma.

Então você precisará pesquisar o formato das solicitações / respostas. Tenho certeza de que, com um pouco de pesquisa, você encontrará um recurso no protocolo http.

Depois disso, você precisará criar um servidor que escute as conexões, responda às solicitações e envie respostas.

Se não é isso que você está perguntando, a sugestão de MichaelT parece razoável.

Dominique McDonnell
fonte