Delphi 2009 で提供されている Indy 10 をいじっていて、OnExecute が起動したときに IOHandler からすべてのデータを取得するのに問題があります...
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); が見つかりました。これは機能しますが、上記の質問に対する答えを知りたいのですが、IO のブロックに基づいているためですか? これにより、この TIdSchedulerOfFiber がさらに熱心になります。