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 

Se me bloquea el programa al desconectar IdTCPClient

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Se me bloquea el programa al desconectar IdTCPClient Responder citando

Hola a todos,

Os cuento, en Builder 2007 tengo un componente IdTCPClient y todo va perfecto, conecta y trabaja sin problemas, pero el fallo está cuando intento desconectar, se me queda bloqueado el programa, sabeis por que?

Lo que hago es:

IdTCPClient1->Disconnect();

Y se queda bloqueado, hay que hacer alguna otra cosa?

Un abrazo.

Carlos
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Al parecer el componente debe desconectarse y conectarse cada vez que realices una operación.

Yo uso el mismo componente de la siguiente manera.
1.- Antes de realizar cualquier operacion verifico el estado del componente
si esta conectado lo desconecto.

Código:
            if (this->IdTCPCliente->Connected()==true)// si esta conectado lo desconectamos
               this->IdTCPCliente->Disconnect();


2.- antes de realizar cualquier peticion uso la siguiente forma para tratar con el componente a travez de la caracteristica de la clase TIdIOHandler

Cita:
TIdIOHandler defines the mechanism used to provide buffered access to data read from or written to a connection using TIdBuffer. Special purpose buffers are also available for sending and receiving large chunks of data, and accumulating data written to a connection for less frequent transmission.

la cual permite el envio y recepcion de trozos grandes de información.

Código:
            this->IdTCPCliente->Connect();
            TIdIOHandler *IOH = dynamic_cast<TIdIOHandler*>(this->IdTCPCliente->IOHandler);


3.- Posteriormente genéro las operaciones hacia el servidor de la siguiente manera

Código:
String ComandoPedir  = "Comando_A_Enviar";
if(IOH->Connected())
{
   IOH->WriteLn(ComandoPedir);
   ///////////////////////////////////
   // se Recibe el tamaño del Archivo
   // que el servidor envia al recibir el comando
   // enviado en la linea de arriba
   int tama = IOH->ReadLn().ToInt();
   ///////////////////////////////////
      TMemoryStream *msBases = new TMemoryStream();
      try
      {
         ///////////////////////////////////
         // Mientras el socket esta conectado
         // Recibir la información que envía el
         // Servidor y guardarlo en un Buffer-Stream
         ///////////////////////////////////
         while(IOH->Connected())
         {
            IOH->ReadStream(msBases,tama,true);
            Application->ProcessMessages();
         }
         ///////////////////////////////////
      }

(4.- por ultimo termino la conexion del IOH cerrando el buffer)
Código:

      __finally
      {
         //////////////////////////////////
         // finalizamos las operaciones
         // y se desconecta la clase IOH
         // del componente IdTcpCliente
         msBases->Position = 0;
         IOH->Close();
      }
}


Espero que eso te ayude a entender el proceso para usar los componentes, aclaro que el codigo mostrado es para recibir un archivo vía sockets desde un servidor a la parte del cliente.


Te aclaro también que es necesario que el IdTcpServer que es el componente que recibe la información tambien debe tratarse de la misma manera y debe ser este quien cierre tambien la conexión hacia el cliente, con algo como esto en su evento OnExecute

Código:
void __fastcall TDMSockets::IdServerExecute(TIdContext *AContext)
{
   TIdIOHandler *IOH = dynamic_cast<TIdIOHandler*>(AContext->Connection->IOHandler);
   IOH->LargeStream = true;
   String sCommand = IOH->ReadLn(); //leemos el comando que han enviado desde el cliente
   ///////////////////////////////////////////////////////////////////////
   if (sCommand == "Comando_que_enviaron" ) //
   {
      TMemoryStream *msFile = new TMemoryStream();
      msFile->LoadFromFile("ruta_del_Archivo");
      try
      {
         ///////////////////////////////////
         // Enviamos el archivo
         // primero el tamaño
         IOH->WriteLn(IntToStr(msFile->Size));
         IOH->WriteBufferClear();
         Application->ProcessMessages();
         ///////////////////////////////////
         // ahora enviamos el archivo completo
         msFile->Position = 0;
         IOH->Write(msFile,msFile->Size,false);
      }
      __finally
      {
         //////////////////////////////////////
         // finalmente cerramos la conexion
         // del cliente
         delete msFile;
         IOH->Close();
      }
   }
}


Saludos.
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Cesar,

No puedo cerrar y abrir por que no se cuando me van a enviar datos, te cuento, es un programa que conecta con una centralita, la centralita envía datos cuando quiere y tengo que estar siempre conectado.

No tengo forma de saber cuando envía datos para conectar el cliente, por eso tengo que estar siempre conectado.

Un abrazo.

Carlos
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
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.