utiles_v2017/sock_sv.cpp

173 lines
3.8 KiB
C++

#include "StdAfx.h"
#include "sock_sv.h"
#include "proceso_cliente.h"
#include "utiles_dll.h"
//********************************************************************
Csock_sv::Csock_sv(BOOL*sal/*=NULL*/, C_error*e/*=NULL*/ )
:Csock_cl(sal,e)
{
sock_cerrado=FALSE;
crea_cliente=NULL;
escucha=NULL;
}
//********************************************************************
Csock_sv::~Csock_sv(void)
{
}
//********************************************************************
void Csock_sv::OnAccept( int nErrorCode )
{
int k;
BOOL del_soc;
SOCKADDR so;
if(pirate && *pirate)
goto salir;
Cproceso_cliente* cli=NULL;
if (escucha)
cli=escucha->crea_cliente(pirate);
else if (crea_cliente)
{
cli=crea_cliente(pirate);
}
if (!cli)
goto salir;
del_soc=cli->soc==NULL;
if(del_soc)
cli->soc = new Csock_sv(pirate);
k = sizeof(SOCKADDR);
if (!Accept( *cli->soc, &so,&k))
{
if(del_soc)
delete cli->soc;
delete cli;
goto salir;
}
//if (strcmp(ss.logp,"DATOS")== 0 && ss.puerto_escucha==50056)
//pso->ss.nosalir=1;
//pso->GetPeerName(cstr, port);
// proscrito, se hace en thread para no usar tiempo de mainthread
//strcpy(pso->ss.ipdot,cstr);
//pso->ss.puerto_llama = port;
//pso->ss.idu_usr = -1;
//ss.time = (UINT) time(NULL);
//pso->ss.time = ss.time;
// crea thread para atender la consulta
cli->lanza("Proceso cliente");
salir:
CAsyncSocket::OnAccept(nErrorCode);
}
//********************************************************************
void Csock_sv::OnClose(int nErrorCode)
{
sock_cerrado = TRUE;
CAsyncSocket::OnClose(nErrorCode);
}
//********************************************************************
//********************************************************************
//********************************************************************
//********************************************************************
BOOL Csock_svThread::InitInstance()
{
if(!CWinThread::InitInstance())
AfxSocketInit();
return TRUE;
}
//********************************************************************
int Csock_svThread::Run()
{
Csock_sv *sc = NULL;
sc = new Csock_sv();
if(!sc)
goto va_mal;
sc->escucha = escucha;
sc->crea_cliente = crea_cliente;
if (!sc->Create(port,
type,evenFlag,
url))
{
goto va_mal;
}
if(!sc->Listen())
goto va_mal;
isLisening = TRUE;
// Run message loop.
BOOL bRes = FALSE;
MSG msg;
while (!pireateTread)
{
while ( PeekMessage (&msg,NULL,NULL,NULL,
PM_NOREMOVE) )
{
PeekMessage (&msg,NULL,NULL,NULL,
PM_REMOVE);
TranslateMessage(&msg);
DispatchMessage(&msg);
}
Sleep(100);
}
va_mal:
if(sc)
{
sc->Close();
delete sc;
}
pireateTread = TRUE;
isLisening = FALSE;
return (0) ;
}
//********************************************************************
BOOL Csock_svThread::liseningThread( int port, char * url, int type, int evenFlag )
{
//AFX_MANAGE_STATE(AfxGetStaticModuleState());
Cutiles_dll dll;
this->port =port;
this->type=type;
this->evenFlag = evenFlag;
this->url =url;
isLisening = FALSE;
pireateTread = FALSE;
CreateThread(CREATE_SUSPENDED) ;
m_bAutoDelete = FALSE ; // Let me delete it.
sName = _T("Test") ; // Initialize something
ResumeThread() ;
while(!pireateTread)
{
if(isLisening)
return TRUE;
Sleep(100);
}
return FALSE;
}
//********************************************************************
Csock_svThread::Csock_svThread()
{
escucha = NULL;
crea_cliente =NULL;
isLisening = FALSE;
pireateTread = TRUE;
}
//********************************************************************
void Csock_svThread::close()
{
pireateTread = TRUE;
while(isLisening)
{
Sleep(10);
}
}
//********************************************************************
Csock_svThread::~Csock_svThread()
{
close();
WaitForSingleObject(m_hThread, INFINITE);
}
//********************************************************************