Delphi Tidtcpserver с заглядыванием из буфера - PullRequest
0 голосов
/ 19 марта 2020

Как я могу прочитать сообщение из контекста tidtcpserver, не удаляя его из буфера чтения? Я хочу просмотреть сообщение и оставить его там, где оно есть.

1 Ответ

1 голос
/ 19 марта 2020

Indy на самом деле не предназначен для просмотра данных, скорее, вы прочитаете целые данные, позволяя блокировать их до тех пор, пока запрошенные данные не будут получены полностью.

* 1006 Как говорится, у TIdBuffer есть метод PeekByte():
function PeekByte(AIndex: Integer): Byte;
var
  B: Byte;

if AContext.Connection.IOHandler.InputBuffer.Size > 0 then
begin
  B := AContext.Connection.IOHandler.InputBuffer.PeekByte(0);
  ...
end;

Или, если вы ищете что-то определенное в буфере (ie, разделитель сообщений, et c), TIdBuffer имеет несколько перегруженных IndexOf() методов:

function IndexOf(const AByte: Byte; AStartPos: Integer = 0): Integer; overload;
function IndexOf(const ABytes: TIdBytes; AStartPos: Integer = 0): Integer; overload;
function IndexOf(const AString: string; AStartPos: Integer = 0;
  AByteEncoding: IIdTextEncoding = nil
  {$IFDEF STRING_IS_ANSI}; ASrcEncoding: IIdTextEncoding = nil{$ENDIF}
): Integer; overload;    
var
  Index: Integer;

Index := AContext.Connection.IOHandler.InputBuffer.IndexOf(SingleByte);
Index := AContext.Connection.IOHandler.InputBuffer.IndexOf(ArrayOfBytes);
Index := AContext.Connection.IOHandler.InputBuffer.IndexOf('string');
...
...