Construir um servidor HTTP simples em C [fechado]


105

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


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.


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 :)

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.


25

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


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.


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


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




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.


1

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


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.