Delphi 2009, Indy 10, TIdTCPServer.OnExecute, cómo capturar todos los bytes en InputBuffer

Estoy jugando con el Indy 10 suministrado con Delphi 2009 y tengo problemas para obtener todos los datos del IOHandler cuando se activa 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 no parece confiable y a menudo devuelve 0, pero en la próxima ejecución a través del OnExecute recogerá el número correcto de bytes, pero eso es demasiado tarde.

sencialmente, quiero poder tomar todos los datos y guardarlos en una UTF8String n una cadena Unicode) y luego analiza un marcador especial. Entonces no tengo encabezados y los mensajes son de longitud variable. Parece que los Indy 10 IOHandlers no están configurados para esto o simplemente lo estoy usando mal.

ería bueno hacer algo como pasar un búfer de cierto tamaño, llenarlo tanto como sea posible y devolver el número de bytes realmente llenos y luego continuar si hay más.

Además, ¿cuál es el estado de TIdSchedulerOfFiber? Esto parece muy interesante, ¿funciona? ¿Alguien lo está usando? Sin embargo, noto que no está en la instalación estándar de Delphi 2009.

Actualizar Encontré Msg: = AContext.Connection.IOHandler.ReadLn (# 0, enUTF8); lo que funciona pero todavía me gustaría saber la respuesta a la pregunta anterior, ¿es porque se basa en bloquear IO? Lo que hace que sea aún más entusiasta en este TIdSchedulerOfFiber.

Respuestas a la pregunta(2)

Su respuesta a la pregunta