Servidor WEB em C para estudo
Nesse primeiro ano na faculdade tivemos um trabalho em grupo que consistia em criar um servidor WEB utilizando a linguagem C. Este servidor deveria ser capaz de responder a uma requisição GET e mostrar as páginas e arquivos solicitados e também retornar erros de acordo com o que não fosse encontrado.
Foi um desafio realmente interessante, afinal estamos no primeiro ano do curso, e foi bom entendermos melhor como funciona o protocolo HTTP, pois para desenvolver o trabalho tivemos que ler a RFC2616 (HTTP) e a RFC2045 (MIME). Para a programação da comunicação utilizamos a API Berkeley Sockets.
Estou disponibilizando aqui o código fonte dessa aplicação, não serve para um servidor de produção, mas com certeza pode auxiliar em algum estudo. Lembrando que somente rodará em máquinas Linux.
Clique aqui para baixar o arquivo na versão atualizada com a correção do bug encontrado pelo usuário geek, segue aqui meus agradecimentos.
OBS: O arquivo está com codificação UTF-8.

Grande Jean.
Legal seu blog.. continua postando seus conhecimentos aí.
vc tem muito a passar pra gente.
Parabens
Bacana o projeto, obrigado pela gentileza de compartilhar o codigo.
Muito bom Jean, adorei o seu código. Apesar de não conhecer muito de C, seu post é bastante interessante, pois acredito que nem só de programação comercial vivem os programadores.
Um pouco de programação científica as vezes é bom e sempre vem a calhar quando precisamos encontrar soluções para problemas do nosso trabalho.
Abração !!
Cara muito legal mesmo. Deitou teve a manha.
Coloca ele numa licença??
Vlws
Obrigado pelos comentários pessoal, nesse curso que faço temos somente uma noção básica da programação C, e nesse trabalho tivemos muito o que pesquisar. Uma preocupação que tive foi comentar muito o código para que qualquer um pudesse entender o que cada linha faz.
que faculdade que é mano?
Muito legal o seu projeto! Eu consegui compila-lo aqui, mais dá o seguinte erro ao executá-lo…
“Nao foi possivel efetuar o bind da porta.”
O que devo fazer?
Thales, esse erro provavelmente é porque vocẽ está rodando o executável com um usuário comum. No código fonte tem a porta utilizada, e está colocado para ser a porta 80, mas para rodar nessa porta só o root tem permissão, se quiser rodar com um usuário comum coloque uma porta acima da 1024.
jac, Cesumar em Maringá no Paraná.
Pessoal, vocês não entenderam, eu não estava criticando o trabalho do Jean que é louvavel e sim tentando alerta-lo sobre possíveis problemas lógicos na implementação do código.
Consegui travar o servidor, vejam abaixo:
Inicializando servidor CesuRedes WebServer v1.0…[OK]
Falha de segmentação
root@filipe-laptop:/home/filipe# telnet localhost 85
Trying 127.0.0.1…
telnet: Unable to connect to remote host: Connection refused
Para reproduzir esse resultado, experimentem mandar uma requisição qualquer sem usar GET
Ou seja, consegui realizar o ataque de negação de serviço.
Muito possivelmente conseguiria-mos um root na máquina que estivesse rodando esse servidor, bastanto codar um exploit que
realize algo mais interessante que um DOS, como executar o /bin/bash por exemplo
Não me entendam mal, sou um geek, eu não conseguiria ver um código bugado e não falar nada
Caro amigo geek, muito obrigado por explicar um dos bugs, por milagre consegui arrumar, pois não sou tão bom assim em programação. No site agora tem a versão com a correção.
A diferença entre “um” geek e um feladamãe é que o geek critica positivamente, enquanto o feladamãe só reclama. Alguns geeks são muito exigentes e fazem criticas destrutivas até, porém saimos melhores depois de uma colaboração dessas. O kernel linux passou por muita coisa pra chegar aonde chegou hoje
Parabéns!