| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
a3093 Lt


Registrado: 27 May 2004Mensajes: 97Ubicación: Las Palmas de Gran Canaria
|
Publicado: Dom 01 Ago, 2004 10:50 pm Asunto: Cómo hacer q el Cliente busque al Server d forma continua? |
|
|
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  |
|
| Volver arriba |
|
 |
Fernando Diaz Master


Registrado: 18 Jul 2004Mensajes: 273Ubicación: Talavera de la Reina (Toledo)
|
Publicado: Dom 01 Ago, 2004 11:17 pm Asunto: |
|
|
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 |
|
 |
a3093 Lt


Registrado: 27 May 2004Mensajes: 97Ubicación: Las Palmas de Gran Canaria
|
Publicado: Lun 02 Ago, 2004 12:32 am Asunto: |
|
|
| 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 |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Lun 02 Ago, 2004 4:59 am Asunto: |
|
|
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... _________________
 |
|
| Volver arriba |
|
 |
a3093 Lt


Registrado: 27 May 2004Mensajes: 97Ubicación: Las Palmas de Gran Canaria
|
Publicado: Lun 02 Ago, 2004 6:12 pm Asunto: |
|
|
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 |
|
 |
Fernando Diaz Master


Registrado: 18 Jul 2004Mensajes: 273Ubicación: Talavera de la Reina (Toledo)
|
Publicado: Lun 02 Ago, 2004 10:13 pm Asunto: |
|
|
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 |
|
 |
a3093 Lt


Registrado: 27 May 2004Mensajes: 97Ubicación: Las Palmas de Gran Canaria
|
Publicado: Lun 02 Ago, 2004 10:25 pm Asunto: |
|
|
| voy a probar |
|
| Volver arriba |
|
 |
Fernando Diaz Master


Registrado: 18 Jul 2004Mensajes: 273Ubicación: Talavera de la Reina (Toledo)
|
Publicado: Lun 02 Ago, 2004 10:32 pm Asunto: |
|
|
ok aora me cuentas , no te olvides de cd conecte pone enabled =false al timer! _________________ Los problemas mas dificiles tienen las soluciones mas sencillas
 |
|
| Volver arriba |
|
 |
a3093 Lt


Registrado: 27 May 2004Mensajes: 97Ubicación: Las Palmas de Gran Canaria
|
Publicado: Mar 03 Ago, 2004 12:10 am Asunto: |
|
|
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 |
|
 |
Fernando Diaz Master


Registrado: 18 Jul 2004Mensajes: 273Ubicación: Talavera de la Reina (Toledo)
|
Publicado: Mar 03 Ago, 2004 10:32 am Asunto: |
|
|
pos nose..... entonces pregunta a los maestros yo no doy mas de si xD _________________ Los problemas mas dificiles tienen las soluciones mas sencillas
 |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Mar 03 Ago, 2004 4:45 pm Asunto: |
|
|
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.. _________________
 |
|
| Volver arriba |
|
 |
a3093 Lt


Registrado: 27 May 2004Mensajes: 97Ubicación: Las Palmas de Gran Canaria
|
Publicado: Mar 03 Ago, 2004 7:04 pm Asunto: |
|
|
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 |
|
 |
|