#pragma once
#include "Csock_cl.h"
#include "th.h"
#include <afxwin.h>
class Cproceso_cliente;
class UTILES_EXPORT Cescucha_sock_sv//interface para que te entren los accept
{
public:
	virtual Cproceso_cliente* crea_cliente(BOOL *pirate)=0;//funcion que crea los procesos cliente en el accept (devuelve null si no se acepta)
};
//socket generico si se pone una escucha crea los socket cliente desde la escucha
//si no desde la funcion crea_cliente
//si el proceso cliente ya tiene un socket creado no se crea si no se crea un socket cliente
class UTILES_EXPORT Csock_sv : public Csock_cl
{
public:
	BOOL sock_cerrado;
	Cescucha_sock_sv *escucha;
	Csock_sv(BOOL* sal=NULL, C_error*e=NULL);
	virtual ~Csock_sv(void);
	Cproceso_cliente* (*crea_cliente)(BOOL *pirate );
	//funciones servidor------------------------------------
	virtual void OnAccept(int nErrorCode);
	virtual void OnClose(int nErrorCode);
	//virtual void run();
	//funciones virtuales de thread win
};
//socket servidor con thread y cola de evntos propia

class UTILES_EXPORT Csock_svThread :public CWinThread
{
	//DECLARE_DYNCREATE(Csock_svThread)
	BOOL isLisening;
	BOOL pireateTread;
	int port, type, evenFlag;
	char * url;

public:
	Cescucha_sock_sv *escucha;
	Cproceso_cliente* (*crea_cliente)(BOOL *pirate );
 	BOOL liseningThread(int port, char * url, int type = SOCK_STREAM, int evenFlag = FD_ACCEPT | FD_READ | FD_CLOSE );//inicia escucha
	void close();//cierra escucha
	//funciones aux------------------------
	~Csock_svThread();
	Csock_svThread();
//AfxSocketInit()
	virtual BOOL InitInstance() ;
	virtual int Run() ;
	CString sName ;//nombre thread
};