Форум: "Сети";
Текущий архив: 2005.11.06;
Скачать: [xml.tar.bz2];
ВнизПомогите разобраться с вот этим кодом... Найти похожие ветки
← →
Senti (2005-07-22 12:08) [0]Есть код, написанный для передачи файлов через компонент ICS.
Одна проблема он получает весь файл в буфер (Pchar) и потом по завершении всей передачи сохраняет на диск, что неприемлимо для больших файлов. К сожалению, не могу разобраться с принципом приема. Необходимо модифицировать так, чтобы каждый блок он сбрасывал в FileStream и обнулял буфер, до получения следущего блока.
Вот сам код:
Пояснение Rcvd : Pchar;
WritePtr : Integer;procedure TRcvThread.RcvWSocket1DataAvailable(Sender: TObject; Error: Word);
var
Count : Integer;
Verb : String[255];
begin
if Error <> 0 then begin
Log(ltError, "ClientDataAvailable " + IntToStr(Error));
Exit;
end;
with Sender as TThreadClient do
try
if IsRcvBin then begin
Count := Receive(Rcvd + WritePtr, FileSize - WritePtr); // Вот с этим не могу разобраться :(((... Странно он их получает. Особенно Rcvd+WritePtr... Как можно к Pchar прибавить integer.. + с каждым разом уменьшается разбер принятого буфера FileSoze-WritePtr...
if Count <= 0 then // Проверяем есть ли данные
Exit;
inc(WritePtr, Count); // Подсчитыем кол-во полученного
if WritePtr = FileSize then
SaveRcvdFile; // Если размер принятого равен размеру файла, то сохраняем его...
Exit;
end;
Count := Receive(@Verb[1], High(Verb)); // При первых данных принимает имя и размер файла.
if Count <= 2 then
Exit;
Verb[0] := Chr(Count - 2); { remove CrLf }
Log(ltRx, Verb);
if FileName = "" then
FileName := Verb
else begin
FileSize := StrToInt(Verb);
GetMem(Rcvd, FileSize);
IsRcvBin := True; // Включаем режим передачи данных
LineMode := False; // Отключаем режим приема строк
end;
except
on E: exception do begin
// Log(ltError, "ClientDataAvailable " + E.ClassName + ": " + E.Message);
CloseDelayed;
end;
end;
end;
Модифицировать не сложно... Но не могу разобраться в самом механизме приема... Помогите кто чем сможет :)
← →
Digitman © (2005-07-22 12:47) [1]
> Как можно к Pchar прибавить integer
PCharValue := PChar(Integer(PCharValue) + IntegerValue);
← →
Senti (2005-07-22 13:05) [2]Да, это понятно но в коде он прописан как Rcvd+WritePtr... Для чего это сделано ?
← →
Digitman © (2005-07-22 13:12) [3]
> Для чего это сделано ?
мало ли для чего ..
по тому шматку содранного тобой кода никаких умозаключений сделать невозможно - декларации этих идентификаторов и фрагменты кода инициализации отсутствуют напрочь
← →
Senti (2005-07-22 13:16) [4]Count : integer // объем принятой информации функции Receive.
Rcvd : Pchar // буфер куда собирается принятая инфа
FileSize, WritePtr : Integer;
Функция:
Receive(Buffer : Pointer; BufferSize: integer) : Integer;
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2005.11.06;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.036 c