Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Помогите разобраться с вот этим кодом... [D6, WinXP]


Senti ©   (2005-07-22 12:08:00) 

Есть код, написанный для передачи файлов через компонент 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;


Модифицировать не сложно... Но не могу разобраться в самом механизме приема... Помогите кто чем сможет :)


Senti   (2005-07-22 13:16:00) [1]

Count : integer // объем принятой информации функции Receive.
Rcvd  : Pchar  // буфер куда собирается принятая инфа
FileSize, WritePtr : Integer;
Функция:
Receive(Buffer : Pointer; BufferSize: integer) : Integer;


Digitman   (2005-07-22 13:12:00) [2]


> Для чего это сделано ?


мало ли для чего ..

по тому шматку содранного тобой кода никаких умозаключений сделать невозможно - декларации этих идентификаторов и фрагменты кода инициализации отсутствуют напрочь


Senti   (2005-07-22 13:05:00) [3]

Да, это понятно но в коде он прописан как Rcvd+WritePtr... Для чего это сделано ?


Digitman   (2005-07-22 12:47:00) [4]


> Как можно к Pchar прибавить integer


PCharValue := PChar(Integer(PCharValue) + IntegerValue);


Наверх

Титульная страница Поиск, карта сайта Написать письмо