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