Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Internet
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 15-01-2005
Avatar de Sr_Sombrero
Sr_Sombrero Sr_Sombrero is offline
Miembro
 
Registrado: may 2003
Posts: 49
Poder: 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
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 20:55:22.


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
Copyright 1996-2007 Club Delphi