Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Cómo hacer q el Cliente busque al Server d forma continua?

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Cómo hacer q el Cliente busque al Server d forma continua? Responder citando

A ver, esta pregunta está relacionada con el hilo del foro titulado buffet lleno. Ahí está mejor explicado el problema.

Aquí lo que pregunto es:

¿Cómo harían ustedes que un cliente estuviera siempre en alerta hasta que se conecte el server?

Gracias, y por favor, una ayudita que ya se me acabaron las ideas Sad
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

prueba esto
solo es una suposicion pues no lo e probado

en un Timer

Código:

cliente->Host="1.2.3.4.5.6.7.xD";
try
{
cliente->Active=true;
}
catch (...)
{  }


y luego si conecta el cliente.... pues poner Timer1->Enabled=false;

espero que te funcione:D
_________________
Los problemas mas dificiles tienen las soluciones mas sencillas
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

No, no hubo suerte. Cada vez que pasa por el ClientSocket->Active=true aumenta la memoria, cosa que no pasa si comento esta linea
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

Puede quedar asi, de esta manera...
Código:

void __fastcall TFESTACION::Timer1Timer(TObject *Sender)
{
    if(!this->ClientSocket1->Active){
        this->ClientSocket1->Open();
    }else{
        this->Timer1->Enabled=false;
        this->Button1->Caption = "INICIAR";
        TfrmAviso *frmAviso = new TfrmAviso;
        frmAviso->Mostrar("El SERVIDOR LOCAL SE HA RESTABLECIDO!!", 3);
        MostrarMensaje=true;
    }
}

Dentro de un Timer, verificas que este conectado, y si no mandas un mensaje dentro de tus Clientes, como el Messenger, para que se muestre, este mensaje es el que ha publicado _LEO, por alguna parte del foro.. que ahora no recuerdo...
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

El problema es que mientras no se haya encendido el server, se va a seguir ejecutando la linea ClientSocket->Open, y cada vez que se ejecuta esta linea, el proceso aumenta su tamaño hasta que llega a un punto q se produce un desbordamiento.

He intentado destruir el socket y volverlo a crear pero no entiendo qué parámetro hay que introducir en el Constructor del ClientSocket. ¿Alguién lo sabe?
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

y esto???

cliente->Host="1.2.3.4.5.6.7.xD";
try
{
cliente->Active=true;
}
catch (...)
{
cliente->Active=false;
cliente->Close();
}

???
_________________
Los problemas mas dificiles tienen las soluciones mas sencillas


Ultima edición por Fernando Diaz el Lun 02 Ago, 2004 10:37 pm, editado 1 vez
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

voy a probar
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

ok aora me cuentas Wink , no te olvides de cd conecte pone enabled =false al timer!
_________________
Los problemas mas dificiles tienen las soluciones mas sencillas
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

Estoy pensando si puede ser mi builder que está mal. No hay manera. De todas formas mil gracias Fernando, tu idea también era buena pero la aplicación sigue aumentando su tamaño en memoria.

Al dejar ejecutando el programa buscando un server, llega a un punto que me sale la siguiente Excepción:

Project ProgramaCliente.exe raised exception class ESocketError with message "Windows socket error: No se puede ejecutar la operación en un socket ya que el sistema no tiene suficiente espacio de búfer o porque una cola estaba llena (10055), on API'connect".
Process stopped. Use Step or Run to continue.[/i]
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

pos nose..... entonces pregunta a los maestros Wink yo no doy mas de si xD
_________________
Los problemas mas dificiles tienen las soluciones mas sencillas
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

yo he realizado la operacion.. y no encuentro problema te paso.. los tres eventos del ClienteSocket que utilizo, mas el Timer para que veas como funciona..


Código:

void __fastcall TFESTACION::ClientSocket1Disconnect(TObject *Sender,
      TCustomWinSocket *Socket)
{
    if(MostrarMensaje){
            this->Timer1->Enabled=true;
            this->Button1->Caption = "Desconectado!!";
            TfrmAviso *frmAviso = new TfrmAviso;
            frmAviso->Mostrar("El SERVIDOR LOCAL SE HA DETENIDO!!", 3);
             MostrarMensaje=false;
        }
}
//---------------------------------------------------------------------------

al haber error dentro del Cliente
Código:

void __fastcall TFESTACION::ClientSocket1Error(TObject *Sender,
      TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{
    if(ErrorCode){
        if(MostrarMensaje){
            this->Timer1->Enabled=true;
            this->Button1->Caption = "Desconectado!!";
            TfrmAviso *frmAviso = new TfrmAviso;
            frmAviso->Mostrar("El SERVIDOR LOCAL NO SE ENCUENTRA!!", 3);
            MostrarMensaje=false;
        }
    }
    ErrorCode = 0;
}


al recibir un mensaje, esto es otra cosa pero lo pongo para que tengas una idea.. las funciones.. que utilizó, si quieres te las paso..
Código:

void __fastcall TFESTACION::ClientSocket1Read(TObject *Sender,
      TCustomWinSocket *Socket)
{
    AnsiString Buff = Socket->ReceiveText();
    AnsiString COMANDO,NOMBRE;
    COMANDO=DivideCadena(Buff,";")->Strings[0];
/*********************APAGAR EQUIPO******************************/
    if(COMANDO=="APAGAR"){  // Bajar estación.
        OSVERSIONINFO osvi;
        osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
        GetVersionEx( &osvi );
        if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT){
            HANDLE hToken;
            TOKEN_PRIVILEGES tkp;
            OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
            LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
            tkp.PrivilegeCount = 1; // one privilege to set
            tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
            AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);
        }
        ExitWindowsEx(EWX_SHUTDOWN | EWX_POWEROFF | EWX_FORCE, 0);
    }



y por ultimo el timer...
es todos...
Código:
void __fastcall TFESTACION::Timer1Timer(TObject *Sender)
{
    if(!this->ClientSocket1->Active){
        this->ClientSocket1->Open();
    }else{
        this->Timer1->Enabled=false;
        this->Button1->Caption = "INICIAR";
        TfrmAviso *frmAviso = new TfrmAviso;
        frmAviso->Mostrar("El SERVIDOR LOCAL SE HA RESTABLECIDO!!", 3);
        MostrarMensaje=true;
    }
}


Espero que te de una idea mejor..
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Hola César.

Primero de nada quiero agradecer tu interés. He probado tu código y es muy parecido al mío. Pero cogiendo tu código te invito a que hagas la siguiente prueba.

1.- Ejecuta el código poniendo el Timer1->Intervalo=100 (así verás el efecto más rápido, aunque a 1000 también se ve el efecto).

2.- No pongas ninguna dirección IP en el ClientSocket.

3.- Abre el administrador de Tareas para que veas el proceso cuando lo ejecutes.

4.- Ejecuta.

Ahí en efecto se puede comprobar en el administrador de tareas que el proceso se mantiene de tamaño de memoria.

Ahora paramos la ejecución del programa para modificar el ClientSocket.

1.- Indica al ClientSocket la dirección de una IP.

2.- Ejecuta (asegúrate que no esté el servidor en marcha).

Ahora sí que se ve como aumenta de tamaño de memoria del proceso en el administrador de Tareas.

Ahora la única esperanza que tengo es no ser el único al que le pasa esto.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor MSN Messenger
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.