Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   Capturar mensajes largos por TClientSocket (https://www.clubdelphi.com/foros/showthread.php?t=30327)

allende 03-04-2006 21:06:19

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

seoane 03-04-2006 21:12:47

¿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.

delphi.com.ar 04-04-2006 14:08:09

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!

allende 04-04-2006 14:15:22

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.

delphi.com.ar 04-04-2006 15:00:42

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?

seoane 04-04-2006 16:45:53

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 :o


La franja horaria es GMT +2. Ahora son las 05:21:38.

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