24 November 2000 - previous November updates: 03 05 07 09 10 13 15 17 20 21 22 24 ; previous updates
1 - CGI Tutorial #01 (parte 2 / 3 )
|
Internet Services Manager - Em Windows 2000, utilize esse programa para fazer a gestão dos serviços disponíveis.
O folder de scripts deverá ter privilégios de execução, pois os programas C são compilados e geram executáveis. |
CGI Tutorial #01 (parte 2 / 3) - Explicação do código C O código C utilizado para escrever software CGI, tal qual disponibilizado na primeira parte desta introdução ao assunto, é muito elementar. Em CGI, a comunicação cliente-servidor faz-se confiando em variáveis de ambiente, pelo que é necessário saber consultar essas entidades, a partir do programa. Como fazê-lo? A "standard library", cujas declarções podem ser incluidas por uma linha "#include char *getenv( const char *varname ); Esta função retorna uma string, correspondente ao valor da variável de ambiente enviada como argumento. Pode-se assim construir "macros" para as consultas às variáveis ambiente. Por exemplo: #define SERVER_SOFTWARE getenv("SERVER_SOFTWARE") faz nascer a macro SERVER_SOFTWARE, que vale o que valer a variável ambiente "SERVER_SOFTWARE"; isto é, indicará que programa está a servir as páginas ao browser. Esse software será também o responsável pela execução dos scripts CGI. Se se fizesse uma escrita do valor associado à macro: printf ("SERVER_SOFTARE= %s", SERVER_SOFTWARE); obter-se-ia, no meu caso particular, em casa, onde utilizo como servidor o Microsoft IIS 5.0: SERVER_SOFTWARE= Microsoft-IIS/5.0 As restantes macros declaradas no programa, servem para exactamente se consultar o valor das variáveis de ambiente: #define SERVER_SOFTWARE getenv("SERVER_SOFTWARE") #define SERVER_NAME getenv("SERVER_NAME") #define GATEWAY_INTERFACE getenv("GATEWAY_INTERFACE") #define SERVER_PROTOCOL getenv("SERVER_PROTOCOL") #define SERVER_PORT getenv("SERVER_PORT") #define REQUEST_METHOD getenv("REQUEST_METHOD") #define PATH_INFO getenv("PATH_INFO") #define PATH_TRANSLATED getenv("PATH_TRANSLATED") #define SCRIPT_NAME getenv("SCRIPT_NAME") #define QUERY_STRING getenv("QUERY_STRING") #define REMOTE_HOST getenv("REMOTE_HOST") #define REMOTE_ADDR getenv("REMOTE_ADDR") #define AUTH_TYPE getenv("AUTH_TYPE") #define REMOTE_USER getenv("REMOTE_USER") #define REMOTE_IDENT getenv("REMOTE_IDENT") #define CONTENT_TYPE getenv("CONTENT_TYPE") #define CONTENT_LENGTH getenv("CONTENT_LENGTH") Repare-se que a declaração de macros é algo meramente sintático, da responsabilidade do pré-processador de C e não do compilador de C. Daqui para a frente só há que perceber que: - no método GET são, acima de tudo, relevantes as variáveis CONTENT_LENGHT e QUERY_STRING; - no método POST são, acima de tudo, relevantes a variável CONTENT_LENGHT e a stream de entrada por defeito (stdin, em C). Assim, para arquivar a informação enviada por uma form, por GET, há que: 1) ler CONTENT_LENGHT 2) ler QUERY_STRING 3) arquivar QUERY_STRING numa variável de CONTENT_LENGHT +1 bytes; o byte extra é uma exigência da linguagem C, que termina todas as strings com o caracter NULL ('\0'). Para arquivar a informação enviada por uma form, por POST, há que: 1) ler CONTENT_LENGHT 2) ler stdin 3) arquivar os bytes (caracteres) presentes em stdin, numa variável de CONTENT_LENGHT + 1 bytes. Mais uma vez, o byte extra é uma exigência da linguagem C, que termina todas as strings com o caracter NULL ('\0'). Concretizando em C, para o caso de POST: 1) int tamanho_da_mensagem=atoi(CONTENT_LENGTH); 2+3) char *frase_da_form=malloc (sizeof (char) * (tamanho_da_mensagem+1)); fread (frase_da_form, sizeof(char), tamanho_da_mensagem, stdin); As forms e código a serem utilizados no tutorial estão disponíveis num ficheiro [ZIP de 72 KB], contendo o código C de funções capazes de fazer a aceitação de qualquer form, por POST e GET; binários CGI para win32; e forms capazes de comunicar com os binários CGI, desde que esteja disponível um servidor, claro. Como é que se põe a funcionar este código? Como fazer uso dele na práctica? Quer servidor usar? Como usá-lo? Estas respostas serão o assunto da terceira e última parte deste primeiro tutorial em CGI. |
Para que haja serviços, o "default web site" tem de estar activo.
Faça "start" ao serviço, caso este não esteja activo. Mais sobre estes assunto, na última parte deste tutorial introdutório ao CGI, em C. |