Construir um servidor HTTP simples em C [fechado]
-
05-07-2019 - |
Pergunta
Eu preciso construir um servidor HTTP simples em C. Qualquer orientação? Links? Amostras?
Solução
Eu sugiro que você dê uma olhada pequena httpd . Se você quiser escrever a partir do zero, então você vai querer completamente RFC 2616 . Use BSD soquetes para o acesso à rede em um nível muito baixo.
Outras dicas
Eu recomendo que você dê uma olhada em: Um Guia Prático para Escrevendo clientes e servidores
O que você tem de implementar em passos incrementais é:
- Obtenha seu camada básica TCP soquetes em execução (escutar na porta / portos, aceitar conexões de cliente e enviar / receber dados).
- Implementar um leitor tamponada de modo que você pode ler os pedidos uma linha (delimitado por CRLF) de cada vez.
- Leia a primeira linha. Analisar o método, a versão pedido e o caminho.
- Implementar análise do cabeçalho para o "Header: value" sintaxe. Não se esqueça desdobramento cabeçalhos dobrados.
- Verifique o método de solicitação, tipo de conteúdo e tamanho do conteúdo para determinar como / se o corpo será lido.
- Implementar a decodificação de conteúdo com base no tipo de conteúdo.
- Se você estiver indo para dar suporte HTTP 1.1, implementar coisas como "100 continuar", keep-alive, de transferência em partes.
- Adicionar medidas robustez / segurança como detectar solicitações incompletas, o que limita o número máximo de clientes etc.
- Shrink Wrap seu código e de código aberto que:)
Um servidor HTTP é conceitualmente simples:
- Abra a porta 80 para ouvir
- Quando o contato é feito, reunir um pouco de informação (obter principalmente - você pode ignorar o resto por agora)
- Traduzir a solicitação em uma solicitação de arquivo
- Abra o arquivo e cuspi-la de volta para o cliente
Ele fica mais difícil, dependendo de quanto de HTTP você quer apoio -. POST é um pouco mais complicado, de scripts, manipulação de várias solicitações, etc
Mas a base é muito simples.
Mongoose (Anteriormente simples HTTP Daemon) é muito bom. Em particular, é incorporável e compila no Windows, Windows CE, e UNIX.
Abrir um soquete TCP na porta 80, começar a ouvir para novas conexões, implementar este . Dependendo de suas finalidades, você pode ignorar quase tudo. No mais fácil, você pode enviar a mesma resposta para cada pedido, que apenas envolve a escrita de texto para o socket.
Olhe para nWeb (Web Server de Nigel), "uma pequena, servidor web seguro [...] com apenas 200 linhas de código fonte C":
https://drive.google.com/file/d/ 0B3msld7qnNOhN1NXaFIwSFU2Mjg / vista? usp = partilha
http://www.ibm.com/developerworks/systems/library / es-nWeb /
O artigo inclui pseudocódigo, explicações e comentários.
EDIT: Link da IBM morreu. Tenho guardado um PDF da página da Web para o Google Drive. Aqui está o download de código:
https://drive.google.com/file/d/ 0B3msld7qnNOhSGZGdDJJMmY0VHM / vista? usp = partilha
ankushagarwal tem feito algumas mudanças e enviou a sua versão no GitHub: https://github.com/ankushagarwal/nweb
Eu escrevi meu próprio que você pode usar. Este funciona tem SQLite, é thread-safe e está em C ++ para UNIX.
Você deve ser capaz de pegá-lo para além e usar o código compatível C.
O HTTP especificação e Firebug foram muito útil para mim quando eu tinha que fazer isso para minha lição de casa.
Boa sorte com o seu. :)
Eu sugiro olhar para a fonte para algo como lighthttpd .
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 implementação / estendendo-o.
Use as funções de soquete plataforma específica para encapsular o protocolo HTTP, assim como caras por trás Apache fez .
Há um duplicado com mais respostas .
Um candidato ainda não mencionada é SPServer .