Esse exemplo de Servidor Web foi usado no projeto da disciplina
Protocolo de Aplicações na IFPB-CG no primeiro periodo
de 2009.
Características básicas: Este código implementa apenas o método GET
do protocolo HTTP versão 1.1. Ele foi feito no Linux utilizando o GCC,
por isso não garanto que funcione no Windows.
Para que ele funcione:
* Configurar um diretório root na linha onde se encontra o #define DIR_ROOT, por padrão o valor é /home/;
* Configurar uma porta valida para o Servidor Web na linha onde se encontra o #define PORTA, por padrão o valor é (7777);
Para compilar:
* No Linux/console digite o seguinte comando → gcc -o httpServer
httpServer.c -pthread na pasta onde se encontra o arquivo
httpServer.c. obs: Seguir exatamente essa sintaxe, se não pode haver
algum erro.. como aconteceu comigo. =/
Para executar:
* No Linux/console acesse a pasta onde se encontra o arquivo httpServer.c depois execute-o com o comando ./httpServer
Simples explicação:
Se você quer compartilhar os arquivos de uma pasta (ex.:
/home/user/) no servidor, então a linha #define DIR_ROOT deve ser
igual a #define DIR_ROOT /home/user/ . Você pode alterar a porta do
servidor para qualquer porta desde que seja maior que 1012 se não me
engano, exemplo: #define PORTA 8888 .
Para testar se o servidor esta OK (com o diretório e porta
devidamente configurados e o arquivo httpServer já executado) abra o seu
browse e digite o endereço <https://localhost:7777/>; onde localhost = endereço local da sua maquina e :7777 = porta do servidor.
Assim que acessar a página, a seguinte mensagem de
erro vai aparecer: Audemar & Fernando WebServer Erro 404 Pagina nao
encontrada, pois o servidor por padrão procura pela página index.html no diretório corrente, caso não seja definido nenhum pedido pelo browser.
Exemplos:
* Exemplo 1: Acessando o endereço <https://localhost:7777/>, entao ele procurará pelo endereço <https://localhost:7777/index.html>;
* Exemplo 2: Se na pasta /home/user/ tiver a pasta imagens /home/user/imagens e você quer acessa-la então digite <https://localhost:7777/imagens> e o servidor irá procurar por <https://localhost:7777/imagens/index.html>.
Caso queira fazer algum pedido (arquivo/pagina.html), /home/user/imagens/foto.jpg por exemplo, digite o endereço <https://localhost:7777/imagens/foto.jpg>. Se o arquivo foto.jpg existir na pasta do servidor então sera feito o envio deste arquivo pelo cliente.
Os pré-requisitos para entender o código são:
* Ter o conhecimento da linguagem de programação C;
* Ter o conhecimento de estruturas de dados paradigma em C ;
* Ter o conhecimento de ponteiros em C;
* Ter conhecimento de Sockets e da biblioteca <sys/socket.h>;
* Ter conhecimento sobre Protocolos;
* e Conhecer o protocolo/cabecalho HTTP versão 1.1
No código fonte desse programa existe uns links sobre alguns assuntos falados acima.
Final:
Esse programa funciona corretamente, o único problema que estou tendo
é que quando mais de um arquivo esta sendo baixado (thread-http/1.1)
simultaneamente e eu cancelo uma, todos os arquivos são cancelados
também.
/*********************** Funcao principal ******************/ int main() { // Limpar a tela system("clear"); printf("n Inicializando servidor %s...",SERVERNAME); Host server; if (setServer(&server, PORTA) > 0) saidaErro(" Nao foi possivel criar o socket do servidor."); printf("n [Inicializado com sucesso]nn"); printf("n ***********************************************************"); printf("n Eu sou o servidor http em C. Estou escutando a porta [%d]", PORTA); printf("n ***********************************************************nn"); Host client[MAX_THREAD]; //Iniciando o vetor de clientes com o valor 0 int i; for (i=0; iMAX_THREAD ) //Se o indice de vetor threadCOD for maior que a capacidade maxima de threads MAX_THREAD threadCOD = 0; // reinicia o indice threadCOD do vetor client com 0 else threadCOD++; //se nao incrementa o indice do vetor client "threadCOD" +1 }//fim do loop }