![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сокеты. Перекачка файла. Глюк! [D5, Win2k]
BJValentine © (2004-07-14 13:41:00)Перекачиваю файл. На сервере
procedure TForm1.SS1ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var St: TFileStream;
begin
if Socket.ReceiveText<>'1' then Exit;
St:=TFileStream.Create('C:\Downloads\bro.avi',fmOpenRead);
Socket.SendStream(St);
end;
на клиенте:
procedure TForm1.CS1Read(Sender: TObject; Socket: TCustomWinSocket);
var
Buf:^byte;
Len: Integer;
f: File;
begin
Len:=Socket.ReceiveLength;
GetMem(buf,len);
Socket.ReceiveBuf(Buf^,len);
AssignFile(f,'c:\2.avi');
if isRecStart then
begin
Rewrite(f,1);
isRecStart:=false;
end
else
begin
Reset(f,1);
seek(f,FileSize(f));
end;
BlockWrite(f,Buf^,len);
Gauge1.Progress:=Gauge1.Progress+(len div 10);
CloseFile(f);
FreeMem(buf,len);
end;
Копирует, но на машине - приёмнике этот файл почему-то больше чуток чем файл-источник :-( Причём каждый раз разница в размерах разная. Сравнивал начала и окончания этих файлов визуально - одинаковые! Почему, где искать ошибку? Сравнил эти файлы: в файле - приёмнике обнаружены вставки неопределённой длины символов #0.
False_Delirium (2004-07-15 13:58:00) [1]В потоке позицию выставляешь, смещения от начала на кол-во прочитаных байт.
BJValentine (2004-07-15 13:15:00) [2]Дык это понятно и пегасу :-) Только как мне отправить данные с сервака с нужного места файла?
False_Delirium (2004-07-15 11:11:00) [3]Посылать на сервер при возобновлении соединения кол-во принятых байт и требовать оставшиеся.:)
BJValentine (2004-07-15 10:39:00) [4]А что нужно изменить на сервере, чтобы была возможность передавать данные блоками? Вдруг связь прервётся. Хочу, чтобы была возможность докачки.
BJValentine (2004-07-14 14:15:00) [5]Спасибо, пища переварилась как следует!
Digitman (2004-07-14 13:58:00) [6]вот тебе пища для размышления : ReceiveBuf() - это ф-ция, и она возвращает некий результат весьма важного характера