PDF de programación - Aplicación Multiproceso sobre HTTP - Ejemplo

Imágen de pdf Aplicación Multiproceso sobre HTTP - Ejemplo

Aplicación Multiproceso sobre HTTP - Ejemplográfica de visualizaciones

Publicado el 30 de Enero del 2019
998 visualizaciones desde el 30 de Enero del 2019
77,4 KB
12 paginas
Creado hace 10a (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, &param );
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, &param );
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, &param );
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, &param );
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, &param );
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
  • Links de descarga
http://lwp-l.com/pdf15017

Comentarios de: Aplicación Multiproceso sobre HTTP - Ejemplo (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad