utiles_v2017/Csock_cl.cpp

339 lines
7.5 KiB
C++
Raw Permalink Blame History

#include "StdAfx.h"
#include "Csock_cl.h"
#include "utiles_dll.h"
#include "_error.h"
#include "utl.h"
//***********************************************************************************************
Csock_cl::Csock_cl(BOOL*sal/*=NULL*/, C_error*e/*=NULL*/ )
{
creado = false;
buf=NULL;
nb=mb=0;
time_sleep=1;
intentos=500;
//creamos log error--------------
if (e)
{
borra_er=FALSE;
er=e;
}
else
{
borra_er=TRUE;
er=new C_error();
}
//ponemos pirate---------------
if(sal)
{
pirate=sal;
borra_pirate=FALSE;
}
else
{
pirate=new BOOL();
borra_pirate=TRUE;
}
}
//***********************************************************************************************
Csock_cl::~Csock_cl(void)
{
if (pirate&&borra_pirate)
free(pirate);
if (buf)
free(buf);
if (borra_er && er)
delete er;
}
//***********************************************************************************************
BOOL Csock_cl::Create( UINT puerto, int tipo, long eventos ,LPCTSTR ip)
{
//AFX_MANAGE_STATE(AfxGetStaticModuleState());
Cutiles_dll dll;
BOOL resul=CAsyncSocket::Create(puerto, tipo,eventos,ip);
if (!resul)
{
er->pon_win(MODULO_CSOCK_CL);
}
else
creado =true;
return resul;
}
//***********************************************************************************************
BOOL Csock_cl::conectar(char *ipdot,int puerto)
{
Cutiles_dll dll;
//AFX_MANAGE_STATE(AfxGetStaticModuleState());
fd_set rfds;
struct timeval tv;
FD_ZERO(&rfds);
FD_SET(this->m_hSocket, &rfds);
tv.tv_sec = 5;
tv.tv_usec = 0;
int err,vez;
CString cstr;
if(!creado && ! Create())
return FALSE;
if (Connect(ipdot, puerto))
{
err = GetLastError();
if(err != WSAEWOULDBLOCK)
{
er->pon_win(MODULO_CSOCK_CL);
return(FALSE);
}
}
//vemos que realmente este conectado
vez = 0;
while (!*pirate)
{
int pruebaconexion = select((int)this->m_hSocket+1, NULL, &rfds, NULL, &tv);
if(pruebaconexion == 1)
break;
else if(pruebaconexion == SOCKET_ERROR && vez>20)
{
er->pon_win(MODULO_CSOCK_CL);
return FALSE;
}
vez++;
Sleep(time_sleep);
if (vez > intentos)
{
er->pon(MODULO_CSOCK_CL,"conectar:Demasiado tiempo esperando");
return FALSE;
}
}
if(*pirate)
{
er->pon(MODULO_CSOCK_CL,"conectar: Solicitud de salida activado");
return FALSE;
}
return TRUE;
}
//***********************************************************************************************
BOOL Csock_cl::recibe_package(int indice)
{
nb=indice;//bytes recibidos;
int bp=0;//bytes del bloque;
//pillamos cabezera------------------------------------------------
if (!recibe((BYTE*)&cab,sizeof(Package_head_0)))
return FALSE;
//verificamos------------------------------------------------------
if(cab.version!=VERSION_PACKAGE_HEAD)
{
er->pon(MODULO_CSOCK_CL,"recibe_package:Versi<73>n de paquete recibido no compatible");
return FALSE;
}
cuida_buf(cab.nb);
//miramos si es un paquete----------------------------------------
if(cab.n==1)
{
if (!recibe((BYTE*)&buf[nb],cab.nb))
return FALSE;//error al parte
nb+=cab.nb;
}
else
{
//pillamos partes---------------------------------------------
for (int i=0; i<cab.n; i++)
{
//pillamos numero-----------------------
if (!recibe((BYTE*)&bp,sizeof(int)))
return FALSE;//error al pillar numero
//verificamos---------------------------
if (nb+bp>mb)
{
er->pon(MODULO_CSOCK_CL,"recibe_package:Paquete defectuoso, tama<6D>o muy grande");
return FALSE;//no entra en buffer
}
//pillamos parte------------------------
if (!recibe((BYTE*)&buf[nb],bp))
return FALSE;//error al parte
nb+=bp;
}
}
//verificamos-----------------------------------------------------
if(cab.nb!=nb-indice)
{
er->pon(MODULO_CSOCK_CL,"recibe_package:Paquete defectuoso, tama<6D>o incorrecto");
return FALSE;//no coinciden bytes
}
//desencriptamos si hace falta------------------------------------
if (cab.flags & FLAG_PACKAGE_HEAD_0_ENCRIPT1)
{
Cutl::descifra1(&buf[indice],cab.nb);
}
return TRUE;
}
//***********************************************************************************************
void Csock_cl::cuida_buf( int n )
{
if (nb+n>=mb)
{
//necesitamos memoria------------------------------------------
mb+=n;
if (buf)
buf=(BYTE*)malloc(mb);
else
buf=(BYTE*)realloc(buf,mb);
}
}
//***********************************************************************************************
BOOL Csock_cl::envia_package( BYTE* buff, int n,int encrip )
{
int env=0;
int en=0;
//rellenamos cabecera----------------------
Package_head_0 cb;
cb.nb=n;
cb.flags=0;
if (encrip==1)
{
cb.flags=cb.flags | FLAG_PACKAGE_HEAD_0_ENCRIPT1;
Cutl::cifra1(buff,n);
}
cb.version=VERSION_PACKAGE_HEAD;
//calculamos bloques---------------------------------
cb.n=(n/MAX_LONG_PACKAGE_0)+1;
cb.nb=n;
//enviamos cabecera----------------------------------
if(!envia((BYTE *)&cb,sizeof(cb)))
{
return FALSE;//error al enviar cabecera
}
//enviamos en uno si se puede------------------------
if (cb.n==1)
{
if (!envia(buff,cb.nb))
{
return FALSE;//error al enviar paquete
}
env=cb.nb;
}
else
{
//enviamos en bloques-----------------------------
for (int i=0; i<cb.n&&!*pirate;i++)
{
//calculamos tama<6D>o envio
en=n-env;
if (en>MAX_LONG_PACKAGE_0)
en=MAX_LONG_PACKAGE_0;
//enviamos numero-----------------------------
if (!envia((BYTE*)&en,sizeof(int)))
{
return FALSE;//error al tama<6D>o
}
//enviamos datos------------------------------
if (!envia(&buff[env],en))
{
return FALSE;//error al enviar datos
}
env+=en;
}
}
if (*pirate)
{
er->pon(MODULO_CSOCK_CL,"envia_package: Solicitud de salida activado");
return FALSE;
}
//verificamos----------------------------------------
return env==n;
}
//***********************************************************************************************
BOOL Csock_cl::recibe( BYTE*b, int n )
{
//int n,k,nv,err;
CString s;
int rec=0, rec_a=0,ier,nv=0;//bytes recibidos
while (!*pirate && rec<n)
{
rec_a = Receive(&b[rec],n - rec,0);
if (rec_a < 0)
{
ier = GetLastError();
if( ier != WSAEWOULDBLOCK )
{
er->pon_win(MODULO_CSOCK_CL);
return(FALSE);
}
nv++;
if (nv > intentos)
{
er->pon(MODULO_CSOCK_CL,"Recibe: Demasiado tiempo esperando");
return FALSE;
}
Sleep(time_sleep);
}
else if (rec_a == 0)
{
er->pon(MODULO_CSOCK_CL,"Recibe: Socket desconectado");
return(FALSE);
}
else
{
rec+=rec_a;
nv = 0;
}
}
if(*pirate)
{
er->pon(MODULO_CSOCK_CL,"Recibe: Solicitud de salida activado");
return FALSE;
}
return TRUE;
}
//***********************************************************************************************
BOOL Csock_cl::envia( BYTE*buff, int n)
{
//int ns,nv,err,ib;
int nv=0,env=0,env_a=0,ier;
//nv = ib = 0;
while (!*pirate && n>env)
{
//enviamos-------------------------------------------
env_a = Send(&buff[env],n-env,0);
if(env_a <= 0)
{
//analizamos el fallo----------------------------
ier = GetLastError();
if (ier != WSAEWOULDBLOCK)
{
er->pon_win(MODULO_CSOCK_CL);
return(FALSE);
}
//toca esperar-----------------------------------
if (nv > intentos)
{
er->pon(MODULO_CSOCK_CL,"Envia: Demasiado tiempo esperando");
return(FALSE);
}
nv++;
Sleep(time_sleep);
}
else
{
env+=env_a;
nv=0;
}
}
if(*pirate)
{
er->pon(MODULO_CSOCK_CL,"Envia: Solicitud de salida activado");
return FALSE;
}
return TRUE;
}
//***********************************************************************************************