Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Internet
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 03-04-2006
allende allende is offline
Miembro
 
Registrado: nov 2003
Posts: 19
Poder: 0
allende Va por buen camino
Capturar mensajes largos por TClientSocket

Hola,

Tengo una applicacion que se conecta con otra mediante sockets. Necesito enviar desde un TServerSocket un volumen grande de datos pero no logro capturarlo completo en el lado del cliente. Solo me recepciona los primeros 8K y si me demoro en leerlos(por tener un punto de ruptura por ejemplo) enseguida me llegan los siguientes 8K y pierdo los primeros.
He tratado infinidades de trucos para completar los bloques pero no lo logro. Alguien puede darme una idea?

salu2
Responder Con Cita
  #2  
Antiguo 03-04-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
¿Puedes poner el codigo que usas? En principo los datos que se mandan a traves de un socket no se borran al llegar mas datos, al contrario, los datos se van colocando unos detras de otros, esperando a que los leas. Podria darse el caso de que se desbordara el buffer que almacena la informacion pero es bastante mas grande de 8K.
Responder Con Cita
  #3  
Antiguo 04-04-2006
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 26
delphi.com.ar Va por buen camino
8K es el tamaño por default:
Código Delphi [-]
var
  dwBuffer: DWORD;
  iSize: Integer;
begin
  with TClientSocket.Create(nil) do
    try
      Host := 'microsoft.com';
      Port := 80;
      Active := True;
      if Socket.SocketHandle <> INVALID_SOCKET then
      begin
        iSize := SizeOf(dwBuffer);
        getsockopt(Socket.SocketHandle, SOL_SOCKET, SO_RCVBUF, PChar(@dwBuffer), iSize);
        ShowMessageFmt('Tamaño del Buffer de Recepción: %d bytes', [dwBuffer]);
      end
    finally
      Free;
    end;

Podes cambiarlo utilizando la función setsockopt, aunque me parece que tienes un problema de diseño, no del tamaño del buffer.

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #4  
Antiguo 04-04-2006
allende allende is offline
Miembro
 
Registrado: nov 2003
Posts: 19
Poder: 0
allende Va por buen camino
Si, estoy de acuerdo contigo. El problema no es aumentar el buffer pues no se el tamaño exacto del texto a enviar. Lo que mas bien necesito es una idea de como poder capturarlo completo, o al menos como unirlo, en el evento OnRead.

saludos y gracias.
Responder Con Cita
  #5  
Antiguo 04-04-2006
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 26
delphi.com.ar Va por buen camino
Cita:
Empezado por allende
Si, estoy de acuerdo contigo. El problema no es aumentar el buffer pues no se el tamaño exacto del texto a enviar. Lo que mas bien necesito es una idea de como poder capturarlo completo, o al menos como unirlo, en el evento OnRead.
¿Cuántas conexiones calculas que mantendrás simultáneamente?
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #6  
Antiguo 04-04-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Lo siento, creo que mi error viene de mi desconocimiento del componente TServerSocket. Yo estoy acostumbrado a usar los socket con las funciones de la API y nunca he tenido problemas para mandar un monton de bytes (incluso un archivo entero cargado en memoria) con una sola instruccion send y luego recogerlo poco a poco del otro lado con la instruccion recv.

Supongo que habra alguna caracteristica de este componente que me paso por alto y que no permite hacer esto. Ademas tengo que aclarar que normalmente uso sockets del tipo Blocking, lo que me lleva a pensar que el problema tambien pueda venir en que tu usas del tipo NonBlocking es decir que realizan sus operaciones de forma asincrona, y aunque no lo puedo asegurar, supongo que utiliza algun tipo de buffer internamente para realizar las operaciones.

Una vez mas disculpas, a veces las ganas de ayudar me lleva a meter la pata
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
tClientSocket, tServerSocket StartKill Varios 5 26-04-2011 21:00:34
Capturar Mensajes de error daly Varios 5 27-10-2005 20:56:46
Capturar Mensajes de Windows externos a la aplicación Descendents API de Windows 1 02-08-2005 16:21:08
Problemas con TCLientSocket epalacios OOP 0 13-04-2005 11:42:28
Capturar mensajes de error de SQL server User_baja1 SQL 2 10-02-2005 18:11:21


La franja horaria es GMT +2. Ahora son las 23:14:40.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi