Blame view

src/include/Socket.h 5.18 KB
Imanol-Mikel Barba Sabariego authored
1
2
3
4
5
6
7
8
9
10
11
/** @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>
Imanol-Mikel Barba Sabariego authored
12
13
#include <sstream>
#include "SocketException.h"
Imanol-Mikel Barba Sabariego authored
14
#include <sys/socket.h>
Imanol-Mikel Barba Sabariego authored
15
#include <sys/types.h>
Imanol-Mikel Barba Sabariego authored
16
#include <netinet/in.h>
Imanol-Mikel Barba Sabariego authored
17
#include <netinet/tcp.h>
Imanol-Mikel Barba Sabariego authored
18
19
20
#include <arpa/inet.h>
#include <netdb.h>
#include <unistd.h>
Imanol-Mikel Barba Sabariego authored
21
22
#include <cstdlib>
#include <cstring>
Imanol-Mikel Barba Sabariego authored
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90

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_ */