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 !