howto.dox 3.62 KB
/** @file	
\author Imanol Barba Sabariego
\date 13/06/2013
\page howto HOWTO
\brief Descripción de funcionamiento y uso de la librería.

\tableofcontents
	A continuación se desglosan las instrucciones para el desarrollo con esta libería y su posterior uso.
	<br><br>
	\section proto Descripción del protocolo
		En las comunicaciones con Sockets hay un problema, es fácil saber la longitud del mensaje que vas a enviar, pero cuesta saber la longitud del mensaje que deseas recibir, ya que la transmisión se puede detener por llegar al fin del mensaje o bien por que hay problemas en la red.

		Los sockets de UNIX nos dan una solución, que es usar llamadas no bloqueantes para recibir el mensaje, es decir: Si leo de un socket, y no he llenado el buffer donde guardo los datos que recibo de allí, la aplicación no se bloquea esperando recibir la suficiente cantidad de datos. A su vez, se usan llamadas a la función <a href="http://linux.die.net/man/2/select">select()</a> para comprovar si hay datos disponibles a para leer o la conexión está terminada.

		Esto requiere uso de la forks e ir haciendo encuesta (polling) al socket, cosa que consume más recursos del sistema.

		Debido a la complejidad añadida que supone hacerlo por esta vía, ya que la librería usa threads que son más ligeros para el sistema y la memoria RAM; se ha optado por implementar un sencillísimo protocolo de comunicación que no supone gasto de computación y repercute de forma nímia en el rendimiento de la transferencia.

		<br>
		\subsection plain Modo en texto llano
			Este modo transmite los carácteres de texto sin ningún tipo de encriptación, por lo tanto son totalmente visibles para cualquier agente intermedio. Sin embargo, el modo sin encriptación es más rápido y ofrece el doble de velocidad de transferencia aproximadamente.
			<br>
		\subsection send Envío/Recepción de mensajes
			El mensaje se transmite de la siguiente forma:

			-# Bob le quiere mandar a Alice un mensaje, primero primero pone el número de carácteres (bytes) que ocupa el mensaje en forma de string terminado con carácter NULL ('\0') y lo manda.
			-# Bob transmite el mensaje íntegro.
			-# Alice lee uno a uno los carácteres del socket hasta encontrar un carácter NULL ('\0'), entonces lee lo que ha recibido, que es la longitud del mensaje real.
			-# Alice pasa a extraer los N bytes que ha leído que recibiría y obtiene el mensaje final.
			<br>
		<br>
	<br>
	\section compile Compilación
		A continuación se detallan las opciones e instrucciones necesarias para compilar esta librería.
		<br>
		\subsection defines	Opciones de compilación
			Los siguientes #defines establecen la configuración en tiempo de compilación
			- \ref RSALENGTH : La longitud de la llave RSA que se usará.
			- \ref AESLENGTH : La longitud de la llave AES que se usará.
			- \ref CONFFILE : La ruta absoluta o relativa al fichero de configuración del servidor (véase: \ref conf).
			- \ref PUBLICKEY : La ruta absoluta o relativa a la llave pública RSA. Existe en server.h y client.cpp
			- \ref PRIVATEKEY : La ruta absoluta o relativa a la llave pública RSA. Existe en server.h y client.cpp
			<br>
		\subsection flags Flags de compilación y librerías
			Flags de compilación necesarios:
			- -I/carpeta/con/cabeceras_de/crypto++ -I/carpeta/con/cabeceras/de_la/librería/Socket
			- -L/carpeta/con/la_librería/crypto++
			- -lcryptopp -lpthread

			Véase: \ref makefile
			<br>
		<br>
	<br>
	\section examples Ejemplos
	A continuación se detalla el código para programar una aplicación servidor cliente sencilla
	<br>
		\subsection server Programar un cliente
			Véase: \ref client_code
			<br>
	<br>
*/