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; i MAX_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
}

Arquivos para Download:

httpServer.zip