 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Carlos J. Fernandez Master


Registrado: 27 Oct 2004Mensajes: 574
|
Publicado: Mie 29 Jul, 2009 12:33 am Asunto: Se me bloquea el programa al desconectar IdTCPClient |
|
|
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 |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Mie 29 Jul, 2009 9:59 am Asunto: |
|
|
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. _________________
 |
|
| Volver arriba |
|
 |
Carlos J. Fernandez Master


Registrado: 27 Oct 2004Mensajes: 574
|
Publicado: Mie 29 Jul, 2009 12:18 pm Asunto: |
|
|
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 |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|