Construir um servidor HTTP simples em C [fechado]

105

Preciso construir um servidor HTTP simples em C. Alguma orientação? Links? Amostras?

Nathan H
fonte
1
Isso é exatamente o que eu pensei
Rik,
1
Eu também tive o mesmo problema agora. Eu usei este link . Espero que isso ajude você também.
Udara SS Liyanage
1
como sobre o FAQ sobre como fazer uma pergunta. você deve saber depois de 3K em representante que esta não é uma questão real, como pode obter tantos votos positivos?
1
Esta é aparentemente uma pergunta muito útil. Por que está fechado?
McBear Holden

Respostas:

85

Eu sugiro que você dê uma olhada no tiny httpd . Se você quiser escrever a partir do zero, então você vai querer cuidadosamente ler RFC 2616 . Use soquetes BSD para acessar a rede em um nível realmente baixo.

Adam Rosenfield
fonte
2
Ou use o inetd e pule a parte da rede.
jrockway
22
Não leia o RFC 2616 agora, ele ficou obsoleto por: RFC 7230 , RFC 7231 , RFC 7232 , RFC 7233 , RFC 7234 , RFC 7235
songhir de
2
tiny httpdtambém está no github aqui: github.com/larryhe/tinyhttpd
Purplejacket
119

Eu recomendo que você dê uma olhada em: Um Guia Prático para Escrever Clientes e Servidores

O que você precisa implementar em etapas incrementais é:

  1. Coloque sua camada de soquetes TCP básica em execução (escute na porta / portas, aceite conexões de cliente e envie / receba dados).
  2. Implemente um leitor de buffer para que você possa ler as solicitações uma linha (delimitada por CRLF) por vez.
  3. Leia a primeira linha. Analise o método, a versão da solicitação e o caminho.
  4. Implemente a análise de cabeçalho para a sintaxe "Cabeçalho: valor". Não se esqueça de desdobrar cabeçalhos dobrados.
  5. Verifique o método de solicitação, tipo de conteúdo e tamanho do conteúdo para determinar como / se o corpo será lido.
  6. Implemente a decodificação de conteúdo com base no tipo de conteúdo.
  7. Se você for oferecer suporte a HTTP 1.1, implemente coisas como "100 Continue", keep-alive, transferência em partes.
  8. Adicione medidas de robustez / segurança, como detectar solicitações incompletas, limitar o número máximo de clientes etc.
  9. Encolher embrulhe seu código e abri-lo :)
Ates Goral
fonte
Ponto # 9, especialmente depois de postar uma pergunta aqui, +1 :)
Matthieu
26

Um servidor HTTP é conceitualmente simples:

  • Abra a porta 80 para ouvir
  • Quando o contato for feito, reúna algumas informações (obtenha principalmente - você pode ignorar o resto por enquanto)
  • Traduzir a solicitação em uma solicitação de arquivo
  • Abra o arquivo e cuspa de volta no cliente

Fica mais difícil dependendo de quanto de HTTP você deseja oferecer suporte - POST é um pouco mais complicado, scripts, manipulação de várias solicitações, etc.

Mas a base é muito simples.

Adam Davis
fonte
25

Mongoose (anteriormente Simple HTTP Daemon) é muito bom. Em particular, ele pode ser incorporado e compilado no Windows, Windows CE e UNIX.

Bob Nadler
fonte
12

Abra um soquete TCP na porta 80, comece a ouvir novas conexões e implemente isso . Dependendo de seus objetivos, você pode ignorar quase tudo. Na melhor das hipóteses, você pode enviar a mesma resposta para cada solicitação, o que envolve apenas a gravação de texto no soquete.

Eclipse
fonte
11

Veja o nweb (Nigel's Web Server), "um servidor web minúsculo e seguro [...] com apenas 200 linhas de código-fonte C":

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

O artigo inclui pseudocódigo, explicações e comentários.

EDIT: o link da IBM morreu. Salvei um PDF da página da web no Google Drive. Aqui está o download do código:

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

@ Ankushagarwal tem feito algumas mudanças e enviou a sua versão no GitHub: https://github.com/ankushagarwal/nweb

XP1
fonte
Eh até votou sem checar o link: / Estou procurando exatamente o que você mencionou, se encontrar algo pode me pingar? Txt
samayo
1
@samayo O link da IBM morreu. Eu forneci alguns espelhos.
XP1
Aqui está um espelho do archive.org - que esperamos estar disponível nos próximos anos: web.archive.org/web/20140905115151/http://www.ibm.com/…
james246
5

Eu escrevi meu próprio para você usar. Este funciona em sqlite, é thread-safe e está em C ++ para UNIX.

Você deve ser capaz de separá-lo e usar o código C compatível.

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

Daniel A. White
fonte
5

A especificação HTTP e Firebug foram muito úteis para mim quando tive que fazer isso para o meu dever de casa.

Boa sorte com o seu :)

Omer van Kloeten
fonte
2

http://www.manning.com/hethmon/ - "Guia Ilustrado para HTTP por Paul S. Hethmon" de Manning é um livro muito bom para aprender o protocolo HTTP e será muito útil para alguém implementá-lo / estendê-lo.

Anjanb
fonte
1

Use funções de soquete específicas da plataforma para encapsular o protocolo HTTP, assim como os caras do Apache fizeram.

arul
fonte