Ver Mensaje Individual
  #1  
Antiguo 06-01-2009
JPMMVR JPMMVR is offline
Miembro
 
Registrado: feb 2008
Posts: 30
Reputación: 0
JPMMVR Va por buen camino
Controlar Read/Write con TCP's

Queria plantear otro problemita que me ha surgido: resulta que tengo 2 aplicaciones, una Server y otra cliente e intento enviar una imagen entre ambos. Para esto utilizo la suit "FUNDAMENTALS 3 - SOCKETS". Pues resulta que al enviar de cliente a Server no hay problema, el server recibe bien el archivo, pero al reves no lo he podido lograr y me he dado cuenta de una cosa: Cuando el Cliente envia los bloques con "WriteBuf", estos bloques no se envian hasta que acabo de escribirlos todos.

El codigo es el siguiente

Código Delphi [-]
procedure Enviarfichero ( fichero:string; Sender: ATCPClient );
var
  Buffer: PByte;
  Leidos: Integer;

begin

  with TFileStream.Create(fichero,fmOpenRead or fmShareDenyWrite) do
  try
    GetMem(Buffer,BufferSize);
    try
      Leidos:= Read(Buffer^,BufferSize);
      while (Leidos > 0) do
      begin
        Sender.Stream.WriteBuffer(Buffer^,Leidos);
        Leidos:= Read(Buffer^,BufferSize);
      end;
    finally
      FreeMem(Buffer);
    end;
  finally
    Free;
  end;
end;

y en el Server tengo:
Código Delphi [-]
procedure RecibirArchivo ( fichero:string; Sender: TTCPServerClient );
var
  Buffer: PByte;
  Recibidos: integer;

begin

  with TFileStream.Create(fichero, fmCreate) do
  try
    GetMem(Buffer,BufferSize);
    try
      Recibidos:=Sender.Stream.Read(Buffer^,BufferSize);

      while Recibidos > 0 do
      begin
        WriteBuffer(Buffer^,Recibidos);
        Recibidos:=Sender.Stream.Read(Buffer^,BufferSize);
      end;
    finally
      FreeMem(Buffer);
    end;
  finally
    Free;
  end;
end;

Pero resulta que cuando quiero enviar a la inversa, es decir Server-Cliente, me surge un problema y es que cuando hago "WriteBuf", este bloque se envia inmediatamente y no espera a tener todo el fichero completo en el BUFFER como ocurre entre Cliente-Server. Esto lo se porque he puesto controles en ambos programas cuando reciben y envian y he podido detectar la inmediatez del envio.

En este caso, el codigo para enviar desde el server es el siguiente:

Código Delphi [-]
procedure Enviarfichero ( fichero:string; Sender: TTCPServerClient );
var
  Buffer: PByte;
  Leidos: Integer;

begin

  with TFileStream.Create(fichero,fmOpenRead or fmShareDenyWrite) do
  try
    GetMem(Buffer,BufferSize);
    try
      Leidos:= Read(Buffer^,BufferSize);
      while (Leidos > 0) do
      begin
        Sender.Stream.Writer.WriteBuffer(Buffer^,Leidos);
        Leidos:= Read(Buffer^,BufferSize);
      end;
    finally
      FreeMem(Buffer);
    end;
  finally
    Free;
  end;
end;

En todo caso lo que intento es lograr parar el envio del "WriteBuf" hasta no acabar de escribir todo el fichero.
Existe alguna manera de abrir y cerrar la comunicacion (sin cerrar la conexion entre ambos), es decir, como un grifo que pueda abrir y cerar segun me interese.?, seguro que en esto esta la clave.

No se si me he podido explicar correctamente, espero que alguien me pueda dar una luz al respecto.

Gracias

Última edición por JPMMVR fecha: 06-01-2009 a las 15:50:51.
Responder Con Cita