Esto es parte del codigo que hay en el evento OnClientRead de mi TServerSocket.(Al que le envian el archivo)
El server es del tipo stNonBlocking.
if (modo=3) then//Recibir tamaño del archivo
begin
avisado:=false;//boolean que indica si se produjo un aviso de error
tam:=socket_clienteS.socket.connections[0].ReceiveText;
tamanyo_archivo:=strtoint(tam);//Tamaño en bytes del archivo que vamos a descargar
recibido:=0;//Bytes recibidos hasta ahora
modo:=2//Sabemos el tamaño-->pasamos al modo descargar archivo
end;
if (modo=2) then //Modo 2=recibir un archivo
begin
iLen := socket_clienteS.Socket.connections[0].ReceiveLength;//iLen= datos recibidos en esta rafaga
recibido:=recibido+iLen; //Total bytes recibidos hasta ahora
GetMem(Bfr, iLen);
try
socket_clienteS.Socket.connections[0].ReceiveBuf(Bfr^, iLen);
F.Write(Bfr^, iLen);
finally
FreeMem(Bfr);
end;
//Aqui iria el codigo para actualizar una TProgressBar
//Si se recibieron mas bytes de los que ocpua el archivo
if (recibido>tamanyo_archivo) then //Si descarga salio mal
begin
if not (avisado)then//Si no se ha avisado ya, avisar del error
begin
showmessage('Algo ha salido mal.');
f.free;
f:=nil;
avisado:=true;//Para que solo realice un solo aviso de error
modo:=0;
end;
end
else
//Si bytes totales recibidos=tamaño en bytes del archivo.
if(tamanyo_archivo=recibido) then //Descarga correcta
begin
F.Free;//F es el TFileStream que use para almacenar los datos que llegaban
f:=nil;
modo:=0;//Modo 0 -->A la espera de una nueva orden
showmessage('Todo bien. Descarga finalizada con exito');
end;
end;//Fin de modo=2
No se....para archivos de hasta 250Ks funciona perfectamente, pero para otros mucho mayores....a veces va bien y a veces no.
El TClientSocket que le envia el archivo, basicamente lo hace de la forma:
Nota:Mi TClientSocket es del tipo ctNonBlocking
//F es una variable TFileStream: La inicializamos para enviar datos.
//Path es un string con el path del archivo que se va a enviar
F:=TfileStream.Create(path,fmOpenRead or fmShareDenyWrite);
Vserver.socket_serverC.Socket.SendStream(f);//enviar archivo
Supongo que solo con estos fragmentos, poca me puedan ayudar....pero tampoco es plan de colapsar el foro con paginas y paginas de codigo...