#pragma once
#include "_log.h"
#include "garray_cicli.h"
#include "proceso_cliente.h"
#include "sock_sv.h"
//falta hacer login revision de paquetes y clase generica de usuarios
class Cclient_gconect_srv;
class UTILES_EXPORT C_escucha_conex_srv//clase para escuchar paquetes recividos en conex_srv
{
public:
	virtual void on_recivido(Csock_cl *soc, BYTE *buf, int nb)=0;//puntero a socket, puntero a paquete, numero de bytes del paquete
	//para desconectar poner a true la variable pirate del soc
	virtual void borra_cliente(Cclient_gconect_srv *cli)=0;//funcion en la que se entra cuando se cierra un cliente(se ha de mandar un mensaje a el principal)
	//no se olvide de restar 1 al numero de thread
};
//clase conexion entre servidores (servicios) y aplicaciones de administracion
class UTILES_EXPORT Cgconect_srv: public C_escucha_log, public Cescucha_sock_sv
{
public:
	//variables----------------------------
	Cgarray_cicli<Msg_evento_log> mens;//cola de mensajes de log
	Clock inter_msg;//interlock para protejer cola de mensajes
	Csock_sv soc_sv;//socket de escucha
	C_escucha_conex_srv *escucha;//recibe paquetes de conexion si no son de log
	BOOL fin;//indica si hay que irse o no;
	int nconex;//indica el numero de conexiones activas en el momento
	/*Clock inter_conex;//interlock para gestionar clientes
	Csock_cl *soc_basura;//puntero a socket para borrar*/
	
	//v y d--------------------------------
	Cgconect_srv(void);
	~Cgconect_srv(void);

	//funciones----------------------------

	virtual void log_ext( __time64_t tiemp, char *modulo, char *fmt );//pone otro mensaje en cola
	virtual Cproceso_cliente* crea_cliente( void );//funcion que crea el cliente

};
class UTILES_EXPORT Cclient_gconect_srv: public Cproceso_cliente//thread de clientes
{
public:
	BOOL codifica;//indica si la comunicacion va cifrada
	Cgconect_srv *principal;//puntero a clase principal
	virtual void rum();//funcion thead de conexion

};
//consejos de utilizacion-----------------------------------------
/*
crear clase y configurar interface (escucha).
configurar socket y poner en lisener.

En el evento borra_cliente enviar un mensaje al que a creado el socket listener.
Dentro de dicho mensaje restar 1 a la variable nconex y hacer un delete al argumento de cliente

para finalizar la aplicación poner a true la variable fin y esperar a que salgan todos los clientes conectados (nconex<=0)
*/
