FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Problema con TIdTCPClient
Bueno, yo hice un proxy utilizando el TIdTCPClient para conectarme con la página que me pedía el explorador a través de un TIdTCPServer.
El problema que tengo es el siguiente. En el encabezado que me devuelve la página, muchas veces me dice el Content-Length, en tal caso yo leo de kilobyte en kilo desde el TIdTCPClient hasta llegar a la longitud dada (por supuesto que leo el mod que me queda {resto}). Pero cuando la página no me envía la longitud del cuerpo del mensage tengo que leer hasta que se desconecte. Pero el problema, es que como es una aplicación que va a estar en la misma máquina donde está el Browser, no puedo bajar todo el archivo y después enviarselo al Internet Explorer, por ejemplo, porque si no este pincha un poco lento y eso. Entonces, en ese caso leo byte a byte con ReadString(1), un byte en este caso. Pero no s[e por qué el componente después de leer todos los bytes, se queda en la función y no vuelve, trabandome el Thread con el que estoy trabajando. Ya, antes de leer el byte le pongo que compruebe si está conectado o no, pero aun así sigue trabandose. Pleas, si alguien me puede ayudar.... |
#2
|
||||
|
||||
Si pones el codigo que usas es mas facil darte una mano.
Saludos, |
#3
|
|||
|
|||
Código
Cita:
Al procedimiento se le pasa el objeto AThread del tipo TIdPeerThread. Al conectarse algún programa, leo el header del request: str:=AThread.Connection.ReadLn(#13#10#13#10,5000); En el procedimiento creo al objeto que va a conectarse a la página pedida var Client: TIdTCPClient (...) Client:=TIdTCPClient.Create(nil); Luego envío el request, que si tiene cuerpo, también lo envío. Después, leo el header (encabezado) de la repuesto str:=Client.ReadLn(#13#10#13#10,15000); Con una función obtengo si existe el campo Content-Length y si es así la función me devuelve la longitud del cuerpo del mensage: l:=GetContentLength(str); If l>0 then begin //Aquí no hay problema end else begin //Aquí es el problema repeat Client.CheckForDisconnect(false); If not Client.Connected then Break; //Aquí es donde se queda trabado str:=Client.ReadString(1); repeat try AThread.Connection.Write(str); blRepeat:=false; except blRepeat:=false; AThread.Connection.CheckforDisconnect; If not ATHread.Connection.Connected then raise; end; until not blRepeat; until not Client.Connected; end; Bueno, espero que me puedan ayudar. Gracias por todo. |
Herramientas | Buscar en Tema |
Desplegado | |
|
|
|