PDA

Ver la Versión Completa : Capturar mensajes largos por TClientSocket


allende
03-04-2006, 21:06:19
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:

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