почему этот код решает поставленную проблему. Без объяснения это не ответ.
иться с 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.