Socket.h 5.18 KB
/** @file 
* \brief Header de la clase Socket
* \author Imanol Barba Sabariego
* \date 12/06/2013
*
* En este fichero se define la clase Socket, que es la clase que se abstraer toda la comunicación con sockets al programador
*/
#ifndef SOCKET_H_
#define SOCKET_H_

#include <iostream>
#include <sstream>
#include "SocketException.h"
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <unistd.h>
#include <cstdlib>
#include <cstring>

using namespace std;

//! Clase del socket
/**
Esta clase define un objeto con los métodos y atributos necesarios para realizar comunicación encriptada o en texto llano a través de un socket TCP/IP
en un entorno UNIX abstrayendo la implementación de sockets y de encriptación al programador.
*/
class Socket
{
        private:
                //! Descriptor del fichero del socket
                /*! Esta variable contiene el file descriptor del socket abierto por el SO. */
                int sock;
                //! Estructura de dirección de socket
                /*! Este struct es usado por el SO para gestionar la dirección del socket abierto. */
                struct sockaddr_in sockAddr;
                //! Método para recibir un mensaje de longitud conocida
                /*! \brief Este método se usa para recibir un mensaje de la longitud que se especifica por argumento y almacenarlo en el buffer 
                proporcionado.

                _Este método garantiza que todo el mensaje se recibirá entero aunque la red no admita una longitud de paquete tan grande._*/
                int Receive(char *buff/*!<Buffer donde se almacena el mensaje recibido*/, int length/*!<Longitud del mensaje a recibir*/);
                //! Método para enviar un mensaje de longitud conocida
                /*! \brief Este método se usa para enviar un mensaje de la longitud especifidada en el argumento y devuelve el número de bytes 
                enviados.

                _Este método garantiza que todo el mensaje se enviará entero aunque la red no admita una longitud de paquete tan grande._*/
                int Send(const char *buff/*!<Buffer con el mensaje a enviar*/, int length/*!<Longitud del mensaje*/);

        public:
                //! Constructor de la clase Socket
                /*! Inicializa el file descriptor del socket y prepara la memoria donde se almacenarán las llaves públicas. */
                Socket();
                //! Método para crear sockets
                /*! Crea un file descriptor para un socket que por defecto no está conectado ni asignado a ninguna dirección. */
                void Create();
                //! Método para hacer bind a una dirección y puerto
                /*! Este método asigna el socket a una dirección IP (y por tanto, a una interfaz de red en concreto) y un puerto, para que 
                posteriormente actúe de servidor escuchando conexiones. */
                void Bind(string address/*!<Dirección IP asignada*/, int port/*!<Puerto asignado*/);
                //! Método para escuchar conexiones
                /*! Este método configura el socket para que se ponga en modo escucha y así pueda atender conexiones entrantes. */
                void Listen(int backlog/*!<Número máximo de conexiones __en espera__*/);
                //! Método para aceptar conexiones
                /*! Este método bloquea el thread que lo ejecuta hasta que recibe una conexión entrante, que almacena como instancia de la clase
                Socket en la referencia proporcionada por argumento. */
                void Accept(Socket &clientSock/*!<Instáncia de Socket que comunica con el cliente entrante*/);
                //! Método para efectuar conexiones
                /*! Este método sirve a los sockets que actúan como cliente para poder efectuar conexiones a otro socket que esté escuchando en la 
                dirección y puerto especificados y atienda conexiones. */
                void Connect(string hostname/*!<Hostname al que conectarse*/, int port/*!<Puerto al que conectarse*/);
                //! Método para cerrar sockets
                /*! Este método cierra el socket para que no se pueda escribir ni leer más en él, para liberarlo del kernel y terminar la conexión TCP. */
                void Close();
                //! Getter para el file descriptor del socket
                /*! Este método devuelve el file descriptor del socket. */
                int getSock();
                //! Método para enviar mensajes
                /*! Este método envía el mensaje que se le proporciona a través del Socket con o sin encriptación según 
                las \ref defines "opciones de compilación" usando el \ref proto "protocolo" implementado. */
                const Socket& operator << ( const string& /*!<Mensaje a enviar*/);
                //! Método para recibir mensajes
                /*! Este método recibe un mensaje de longitud arbitrária con o sin encriptación según las \ref defines "opciones de compilación" usando
                el \ref proto "protocolo" implementado. */
                const Socket& operator >> ( string& /*!<Mensaje a recibir*/);
};
#endif /* SOCKET_H_ */