Ver Mensaje Individual
  #1  
Antiguo 15-01-2005
Avatar de Sr_Sombrero
Sr_Sombrero Sr_Sombrero is offline
Miembro
 
Registrado: may 2003
Posts: 49
Reputación: 0
Sr_Sombrero Va por buen camino
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.

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 !
Responder Con Cita