Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   Recibir archivo con ReceiveBuf (https://www.clubdelphi.com/foros/showthread.php?t=17624)

Sr_Sombrero 15-01-2005 08:16:37

Recibir archivo con ReceiveBuf
 
Estoy tratando de transferir un archivo con SendBuf y ReceiveBuf. El motivo de usar este método es que quiero que mi aplicación sea pequeña.

Por el lado del cliente uso una socket unit de Delphi modificada (sin SysUtils y Classes pesa el 10 % de la original). No tiene sendstream pero el resto es igual a la de delphi.
El cliente envía el archivo sin problemas.

Por el lado del server uso el socket de Delphi (este sin modificar).

El archivo se transfiere bien pero cuando termina se cuelga el server y mientras se está transfirendo no responde. :mad:

Esté es el código que tengo en el server en el evento OnRead y el que creo que está causando el problema.
Código:

procedure TFrmMain.ServerSocketTransferClientRead(Sender: TObject;
  Socket: TCustomWinSocket);

var
  Data: string;
  Buffer: pchar;
  BinaryFile: file of char;
  BinaryFileSize, BytesRead: integer;
  Filename: string;

begin
  Filename:= 'c:\lala01.mp3';
  Idle(0);
  Data := Socket.ReceiveText;
  BinaryFileSize := StrToInt(Data);
  Idle(0);
  AssignFile(BinaryFile, FileName);
  ReWrite(BinaryFile);
  while FileSize(BinaryFile) < BinaryFileSize do
  begin
    Sleep(1);
    BytesRead := Socket.ReceiveLength;
    if BytesRead > 0 then
    begin
      GetMem(Buffer, BytesRead);
      try
        Socket.ReceiveBuf(Buffer^, BytesRead);
        BlockWrite(BinaryFile, Buffer^, BytesRead);
      finally
        FreeMem(Buffer);
      end;
    end;
  end;
  CloseFile(BinaryFile);
end;

Este es el código que va en el cliente y que asumo que está bien ya que lo probé con un server que no hice yo y recibe el archivo perfectamente.
Código:

Procedure SendFile (FileName: string);
var
  BinaryFileSize, BytesRead: integer;
  Buffer: pchar;
  BinaryFile: file of char;
  BinaryFileHandle: THandle;
begin
  BinaryFileHandle := CreateFile(pchar(FileName), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL OR FILE_FLAG_NO_BUFFERING, 0);
  BinaryFileSize := GetFileSize(BinaryFileHandle, nil);
  CloseHandle(BinaryFileHandle);
  AssignFile(BinaryFile, FileName);
  Reset(BinaryFile);
  ClientSocket3.Socket.SendText(inttostr(BinaryFileSize));
  Sleep(500);
  repeat
    Sleep(1);
    GetMem(Buffer, 2048);
    try
      BlockRead(BinaryFile, Buffer^, 2048, BytesRead);
      ClientSocket3.Socket.SendBuf(Buffer^, BytesRead);
    finally
      FreeMem(Buffer);
    end;
  until BytesRead < 2048;
  CloseFile(BinaryFile);
end;

Espero que con vuestra sabiduría me den alguna pista.
Saludos !


La franja horaria es GMT +2. Ahora son las 17:04:47.

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