Gracias por la respuesta poliburro pero es que ya tengo muy avanzada la aplicacion como pa meterme ahora a investigar p2p...
De todas maneras ya lo consegui y voy a explicar mis conclusiones por si a alguien le hace falta:
1- Efectivamente, hay que rellenar el Stream en la llamada al evento OnRead correspondiente al envio, es decir, el cliente envia una palabra clave para indicar que a continuacion se va a enviar un stream:
Código Delphi
[-]
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
begin
socket.SendText('TOMASTREAM'); socket.SendStream(stream);end;
El servidor recibe la palabra clave y se dispara el evento OnRead, la palabra clave le indica que la proxima vez que se dispare OnRead va a recibir el stream, recibiendo la cantidad transferida en Socket.ReceiveBuf pero, y he aqui lo importante,
SOLO EN LA PROXIMA LLAMADA A OnRead, es decir, si se dispara otra vez OnRead y se vuelve a llamar a Socket.ReceiveBuf ya no contendra la informacion...¿ como solucionarlo? Pues mi solucion ha sido controlar con un contador si se ha recibido la palabra clave en cuyo caso la siguiente vez que se dispare OnRead espero a rellenar el stream...no se si quedo claro pero igual el codigo ayuda:
Código Delphi
[-]
procedure TForm1.FormCreate(Sender: TObject);
begin
vez:=0;
end;
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
nReceived:integer;
Buffer: array [0..99999] of char;
Stream:TMemoryStream;
begin
[...]
if vez=1 then begin
vez:=0; Stream := TMemoryStream.Create;
Screen.Cursor := crHourglass;
try
while True do
begin
nReceived := Socket.ReceiveBuf (Buffer, sizeof (Buffer)); if nReceived <= 0 then Break
else
Stream.Write (Buffer, nReceived); Sleep (200);
end;
Stream.Position := 0;
stream.SaveToFile(directorio+nombre);
finally
end;
Stream.Free;
Screen.Cursor := crDefault;
exit;
end;
if (pos('TOMASTREAM',strcom)=1) and (vez<2) then begin
vez:=vez+1;
exit;
end;
end;
end;
Evidentemente se podria usar un boolean para controlar la recepcion de la palabra clave pero acabo de conseguir que funcione y no lo he optimizado todavia...
Un detalle importante es que en el evento OnRead debemos controlar si se va a recibir el stream
antes de acceder a la informacion del Socket, es decir, antes de llamar a socket.receivetext o socket.receivebuf, para rellenarlo
Espero que se haya entendido algo...
Un saludo!
JMGR