Publicado el 30 de Enero del 2019
1.113 visualizaciones desde el 30 de Enero del 2019
77,4 KB
12 paginas
Creado hace 11a (30/10/2013)
Laboratorio de Sistemas Operativos
Curso 2013/2014
LABORATORIO DE SISTEMAS OPERATIVOS
(Curso 2013/2014)
PRÁCTICA 3
Aplicación Multiproceso sobre HTTP – Ejemplo -
Objetivos del documento
Este documento presenta un ejemplo, en el contexto de desarrollo planteado en el enunciado de la
práctica 3, de cómo implementar un servidor web sencillo capaz de atender a una única petición HTTP
efectuada a través de una conexión con un cliente.
El ejemplo se desarrolla mediante un proceso incremental en el que cada una de las fases tiene como
objetivo que el alumno se familiarice con el uso y funcionalidad de las principales funciones del módulo
http y comprenda el comportamiento básico de un proceso encargado de gestionar una conexión con un
cliente.
Se recomienda que el alumno escriba, compile y ejecute cada una de las fases.
Paso 1: Lectura de parámetros
#include <stdio.h>
#include <stdlib.h>
#include "param.h"
#include "http.h"
int main(int argc, char** argv)
{
}
ParametrosServidor param;
/* Procesar los parámetros de configuración */
analizar_linea_mandatos ( argc, argv, ¶m );
if ( param.nivel_depuracion > 0 )
fprintf ( stderr, "\nPuerto del Servidor:: %d\n", param.puerto_escucha );
/* comprobar que param.directorio_base existe y es un directorio */
return(0);
Ejemplo Práctica 3 – página 1 -
Laboratorio de Sistemas Operativos
Curso 2013/2014
Paso 2: Creación de GestorHTTP
#include <stdio.h>
#include <stdlib.h>
#include "param.h"
#include "http.h"
int main(int argc, char** argv)
{
fprintf ( stderr, "\nDescriptor del gestor :: %d\n",
http_obtener_descriptor_escucha ( gHttp ) );
}
ParametrosServidor param;
GestorHTTP* gHttp;
/* Procesar los parámetros de configuración */
analizar_linea_mandatos ( argc, argv, ¶m );
if ( param.nivel_depuracion > 0 )
fprintf ( stderr, "\nPuerto del Servidor:: %d\n", param.puerto_escucha );
/* comprobar que param.directorio_base existe y es un directorio */
/* Crear gestorHTTP */
if ( ( gHttp = http_crear ( param.puerto_escucha ) ) == NULL ){
}
/* descriptor asociado al puerto de escucha */
if ( param.nivel_depuracion > 0 )
/* destrucción del gestor */
http_destruir ( gHttp );
return(0);
fprintf( stderr, "\n....ERROR: No se ha podido crear el gestor" );
exit(1);
Ejemplo Práctica 3 – página 2 -
Laboratorio de Sistemas Operativos
Curso 2013/2014
fprintf( stderr, "\n....ERROR: No se ha podido crear el gestor");
exit(1);
Paso 3: Esperar conexión de cliente
#include <stdio.h>
#include <stdlib.h>
#include "param.h"
#include "http.h"
int main(int argc, char** argv)
{
}
ParametrosServidor param;
GestorHTTP* gHttp;
ConexionHTTP* cliente;
/* Procesar los parámetros de configuración */
analizar_linea_mandatos ( argc, argv, ¶m );
if ( param.nivel_depuracion > 0 )
fprintf ( stderr, "\nPuerto del Servidor:: %d\n",param.puerto_escucha);
/* comprobar que param.directorio_base existe y es un directorio */
/* Crear gestorHTTP */
if ( (gHttp = http_crear ( param.puerto_escucha ) ) == NULL){
}
/* Esperar conexión de cliente */
switch ( http_esperar_conexion ( gHttp, &cliente, 1 ) )
{
}
/* destrucción del gestor */
http_destruir ( gHttp );
return(0);
case HTTP_OK:
if ( param.nivel_depuracion > 0 )
fprintf ( stderr, "\nConexión de Cliente con IP %s establecida.\n",
http_obtener_ip_cliente ( cliente ) );
/* cerrar conexión */
http_cerrar_conexion ( cliente );
break;
case HTTP_SEGUIR_ESPERANDO:
case HTTP_ESPERA_INTERRUMPIDA:
break;
case HTTP_ERROR:
fprintf ( stderr, "\n...ERROR: http_esperar_conexión" );
break;
Prueba: establecer una conexión con el servidor utilizan alguno de los mecanismos presentados en el
enunciado de la práctica 3.
Ejemplo Práctica 3 – página 3 -
Laboratorio de Sistemas Operativos
Curso 2013/2014
Paso 4: Esperar petición de cliente
#include <stdio.h>
#include <stdlib.h>
#include "param.h"
#include "http.h"
void atender_cliente ( ConexionHTTP* cliente );
/* variables globales */
ParametrosServidor param;
int main(int argc, char** argv)
{
}
GestorHTTP * gHttp;
ConexionHTTP* cliente;
/* Procesar los parámetros de configuración */
analizar_linea_mandatos ( argc, argv, ¶m );
if ( param.nivel_depuracion > 0 )
fprintf ( stderr, "\nPuerto del Servidor:: %d\n",param.puerto_escucha);
/* comprobar que param.directorio_base existe y es un directorio */
/* Crear gestorHTTP */
if ( (gHttp = http_crear ( param.puerto_escucha ) ) == NULL){
}
/* Esperar conexión de cliente */
switch ( http_esperar_conexion ( gHttp, &cliente, 1 ) )
{
}
/* destrucción del gestor */
http_destruir ( gHttp );
return(0);
case HTTP_OK:
if ( param.nivel_depuracion > 0 )
fprintf ( stderr, "\nConexión de Cliente con IP %s establecida.\n",
http_obtener_ip_cliente(cliente) );
/* atender cliente */
atender_cliente ( cliente );
/* cerrar conexión */
http_cerrar_conexion( cliente );
break;
case HTTP_SEGUIR_ESPERANDO:
case HTTP_ESPERA_INTERRUMPIDA:
break;
case HTTP_ERROR:
fprintf ( stderr, "\n...ERROR: http_esperar_conexión" );
break;
fprintf( stderr, "\n....ERROR: No se ha podido crear el gestor");
exit(1);
Ejemplo Práctica 3 – página 4 -
Laboratorio de Sistemas Operativos
Curso 2013/2014
void atender_cliente ( ConexionHTTP* cliente )
{
}
Peticion* peticion;
int estado;
/* leer peticion */
switch ( estado = http_leer_peticion ( cliente, &peticion, 1 ) )
{
}
case HTTP_OK:
if ( param.nivel_depuracion > 0 )
fprintf ( stderr, "Petición: IP=%s, RECURSO: %s\n",
peticion->ip_cliente, peticion->fichero );
http_destruir_peticion ( peticion );
break;
case HTTP_CLIENTE_DESCONECTADO:
if ( param.nivel_depuracion > 0 )
fprintf ( stderr, "\n....ERROR: Detectado cliente desconectado\n");
break;
case HTTP_ESPERA_INTERRUMPIDA:
break;
case HTTP_ERROR:
fprintf ( stderr, "\n...ERROR: Error http_leer_peticion \n");
fflush ( stderr );
break;
Prueba: ejecutar el servidor utilizando como directorio base el directorio paginas referenciado en el
enunciado de la práctica 3 y solicitar el recurso ‘basica.htm’.
Ejemplo Práctica 3 – página 5 -
Laboratorio de Sistemas Operativos
Curso 2013/2014
Paso 5: Procesar petición de cliente
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/param.h>
#include "param.h"
#include "http.h"
void atender_cliente ( ConexionHTTP* cliente );
void atender_peticion (ConexionHTTP* cliente, Peticion* peticion );
/* variables globales */
ParametrosServidor param;
int main(int argc, char** argv)
{
GestorHTTP * gHttp;
ConexionHTTP* cliente;
/* Procesar los parámetros de configuración */
analizar_linea_mandatos ( argc, argv, ¶m );
if ( param.nivel_depuracion > 0 )
fprintf ( stderr, "\nPuerto del Servidor:: %d\n",param.puerto_escucha );
/* comprobar que param.directorio_base existe y es un directorio */
/* Crear gestorHTTP */
if ( (gHttp = http_crear ( param.puerto_escucha ) ) == NULL){
}
/* Esperar conexión de cliente */
switch ( http_esperar_conexion ( gHttp, &cliente, 1 ) )
{
}
/* destrucción del gestor */
http_destruir ( gHttp );
case HTTP_OK:
if ( param.nivel_depuracion > 0 )
fprintf ( stderr, "\nConexión de Cliente con IP %s establecida.\n",
http_obtener_ip_cliente ( cliente) );
/* atender cliente */
atender_cliente ( cliente );
/* cerrar conexión */
http_cerrar_conexion( cliente );
break;
case HTTP_SEGUIR_ESPERANDO:
case HTTP_ESPERA_INTERRUMPIDA:
break;
case HTTP_ERROR:
fprintf ( stderr, "\n...ERROR: http_esperar_conexión" );
break;
fprintf( stderr, "\n....ERROR: No se ha podido crear el gestor");
exit(1);
Ejemplo Práctica 3 – página 6 -
Laboratorio de Sistemas Operativos
Curso 2013/2014
return(0);
}
void atender_cliente ( ConexionHTTP* cliente )
{
Peticion* peticion;
int estado;
/* leer peticion */
switch ( estado = http_leer_peticion ( cliente, &peticion, 1 ) )
{
}
}
case HTTP_OK:
if ( param.nivel_depuracion > 0 )
fprintf ( stderr, "Petición: IP=%s, RECURSO: %s\n",
peticion->ip_cliente, peticion->fichero );
/* servir el recurso si es un fichero y se tienen permisos
de lectura */
atender_peticion( cliente, peticion );
http_destruir_peticion ( peticion );
break;
case HTTP_CLIENTE_DESCONECTADO:
if ( param.nivel_depuracion > 0 )
fprintf ( stderr, "\n....ERROR: Detectado cliente desconectado\n");
break;
case HTTP_ESPERA_INTERRUMPIDA:
break;
case HTTP_ERROR:
fprintf ( stderr, "\n...ERROR: Error en http_leer_peticion \n");
break;
Ejemplo Práctica 3 – página 7 -
Laboratorio de Sistemas Operativos
Curso 2013/2014
! strncmp ( peticion->fichero, "../", 3 ) ){
http_enviar_codigo ( cliente, peticion, 403, "No autorizado" );
if ( param.nivel_depuracion > 0 )
fprintf ( stderr, "... PETICION_ERROR: fichero no autorizado:: %s\n",
peticion->fichero );
return;
char nombre_fichero[MAXPATHLEN];
cons
Comentarios de: Aplicación Multiproceso sobre HTTP - Ejemplo (0)
No hay comentarios