#pragma once
#include <afxsock.h>
#include "base_head.h"
#define	MAX_CHAR_BLOQ_STRSOCKET		1024	//Maximo de caracteres por envio
#include "_error.h"

#define	ESPERA_STRSOCKET		1	//milis en sleep
#define	ESPERA_SEG_STRSOCKET		3//SEGUNDOS MAXIMOS INTENTANDO RECIBIR ENVITOS
#define VECES_ESPERA_STRSOCKET	((1000 * ESPERA_SEG_STRSOCKET) / ESPERA_STRSOCKET)
#define MIN_REALLOC_STR_SOC		512	//bytes
/*
Socket cliente para envio de informacion ascii (string)
*/
class UTILES_EXPORT Cstr_socket : public CAsyncSocket
{
public:
	//variables--------------------------------------
	C_error er;//variable que da info de posibles errores
	BOOL pirate;//==TRUE -> se cancela todas las tareas del socket
	long cli_currando;//indica que el socket esta en uso
	Cstr_socket		*pp; //puntero al padre
	//variables aux----------------------------------
private:
	char *buf;//buffer de envios
	int n, m;//ocupacion y capacidad del buffer
	int nb;//indica el numero de bytes que va por envio total
	
public:
	//c y d------------------------------------------
	Cstr_socket(void);
	~Cstr_socket(void);
public:
	//funciones--------------------------------------
	BOOL crear(char *ip=NULL, int puerto=0);//crea el socket en la ip y puerto de salida indicados
	BOOL conecta(char *ip, int puerto);//contecta a servidor
	char* recibir();//recibe string;
	BOOL envia( char *fmt, ...);//envia string
	void cierra();//cierra socket
	char *getbuf();//devuelve buffer del socket
	//funciones auxiliares---------------------------
private:
	BOOL cuida_mem(int nbb);//pide memoria si hace falta
	int recibir(BYTE *b, int nbb);//recive nbb bytes y los deja en b
	BOOL enviar(int nbb,BYTE *b);

};
/*
Socket servidor para envio de informacion ascii (string)
*/
class UTILES_EXPORT Cstr_socket_srv : public Cstr_socket
{	
	//variables aux----------------------------------
private:
	HWND wnd;//ventana a la que mandar eventos
	int id_even, id_comman;
	BOOL *sal_soc;
	int t_out;//tiempo de salida sin hacer nada
	__int64 t;
public:
	//c y d------------------------------------------
	Cstr_socket_srv(void);
	~Cstr_socket_srv(void);
	//funciones--------------------------------------
	virtual BOOL  on_datos_recibidos(char *txt)=0;//funcion donde procesar los datos
	virtual Cstr_socket_srv*  crea_cliente()=0;//funcion donde procesar los datos
	
	BOOL pon_escucha(char *ip, int puerto);
	void pon_wnd_destruc(HWND wnd,int id_comman,int id_even);
	//funciones auxiliares---------------------------
private:
	
	
public:
	void run();
	virtual void OnAccept(int nErrorCode);
	virtual void OnClose(int nErrorCode);
	static UINT th_funcion(LPVOID pp);
	void pon_tout( int t_out );
};
//funciones de socket cliente para pinvoke-----------------------------------------------------
extern "C" UTILES_EXPORT Cstr_socket *str_socket_crea();
extern "C" UTILES_EXPORT BOOL str_socket_conecta(Cstr_socket *soc, char *ip, int puerto);
extern "C" UTILES_EXPORT BOOL str_socket_envia(Cstr_socket *soc, char *txt);
extern "C" UTILES_EXPORT int str_socket_recive(Cstr_socket* soc);
extern "C" UTILES_EXPORT void str_socket_dame_buf(Cstr_socket* soc, char* buf);
extern "C" UTILES_EXPORT void str_socket_dame_error(Cstr_socket* soc, char* error);
extern "C" UTILES_EXPORT void str_socket_borra(Cstr_socket* soc);  