почему этот код решает поставленную проблему. Без объяснения это не ответ.

иться с Indy 10, поставляемой с Delphi 2009, и у меня возникают проблемы с получением всех данных от IOHandler, когда OnExecute срабатывает ...

procedure TFormMain.IdTCPServerExecute(AContext: TIdContext);
var
  RxBufStr: UTF8String;
  RxBufSize: Integer;
begin

  if AContext.Connection.IOHandler.Readable then
  begin
    RxBufSize := AContext.Connection.IOHandler.InputBuffer.Size;
    if RxBufSize > 0 then
    begin
      SetLength(RxBufStr, RxBufSize);
      AContext.Connection.IOHandler.ReadBytes(TBytes(RxBufStr), RxBufSize, False);
    end;
  end;

end;

AContext.Connection.IOHandler.InputBuffer.Size не кажется надежным и часто возвращает 0, но при следующем запуске через OnExecute он выберет нужное количество байтов, но это слишком поздно.

По сути, я хочу иметь возможность просто захватить все данные, поместить их в UTF8String (не строка Unicode), а затем проанализировать специальный маркер. Поэтому у меня нет заголовков и сообщений переменной длины. Кажется, что Indy 10 IOHandlers не настроены для этого, или я просто использую это неправильно.

Было бы неплохо сделать что-то вроде прохождения буфера определенного размера, заполнить его как можно больше и вернуть количество фактически заполненных байтов, а затем продолжать работу, если их больше.

Кроме того, каково состояние TIdSchedulerOfFiber, это выглядит очень интересно, он работает? Кто-нибудь использует это? Я заметил, что это не входит в стандартную установку Delphi 2009, хотя.

Обновить: Я нашел Msg: = AContext.Connection.IOHandler.ReadLn (# 0, enUTF8); который работает, но я все еще хотел бы знать ответ на поставленный выше вопрос, потому что он основан на блокировке ввода-вывода? Что делает еще более увлеченным этим TIdSchedulerOfFiber.

Ответы на вопрос(2)

Ваш ответ на вопрос