Home > C/C++, Programação > Servidor WEB em C para estudo

Servidor WEB em C para estudo

dezembro 1st, 2008

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.

C/C++, Programação , ,

  1. dezembro 1st, 2008 at 21:01 | #1

    Grande Jean.

    Legal seu blog.. continua postando seus conhecimentos aí.
    vc tem muito a passar pra gente.

    Parabens

  2. dezembro 2nd, 2008 at 17:11 | #2

    Bacana o projeto, obrigado pela gentileza de compartilhar o codigo.

  3. dezembro 2nd, 2008 at 18:45 | #3

    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 !!

  4. Vinicius Tinti
    dezembro 2nd, 2008 at 21:04 | #4

    Cara muito legal mesmo. Deitou teve a manha.

    Coloca ele numa licença??

    Vlws

  5. dezembro 3rd, 2008 at 02:04 | #5

    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.

  6. jac
    dezembro 3rd, 2008 at 08:35 | #6

    que faculdade que é mano?

  7. dezembro 3rd, 2008 at 09:02 | #7

    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?

  8. dezembro 3rd, 2008 at 10:09 | #8

    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á.

  9. geek
    dezembro 3rd, 2008 at 10:55 | #9

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

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

  10. dezembro 3rd, 2008 at 12:26 | #10

    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.

  11. dezembro 3rd, 2008 at 22:03 | #11

    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!

  1. dezembro 1st, 2008 at 21:04 | #1
  2. dezembro 2nd, 2008 at 16:03 | #2
  3. dezembro 8th, 2008 at 00:55 | #3