Delphi 2009 ile birlikte verilen Indy 10 ile uğraşıyorum ve OnExecute yangınları sırasında IOHandler'daki tüm verileri alma konusunda sorun yaşıyorum. ..Delphi 2009, Indy 10, TIdTCPServer.OnExecute, InputBuffer'daki tüm baytları nasıl yakalayacağınız
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 güvenilmez görünüyor ve çoğu zaman 0 verir, ancak OnExecute throug sonraki kaçak bunun bayt doğru sayıda alırım ama yani yok çok geç.
Esasen tüm verileri yakalayabilmem, UTF8String'e ( bir Unicode dizesi) sığdırmak ve sonra özel bir işaretleyici için ayrıştırmak istiyorum. Yani başlık yok ve mesajlar değişken uzunluktadır. Indy 10 IOHandlers bunun için kurulum değil gibi görünüyor ya da sadece yanlış kullanıyorum.
Belirli bir boyutta bir arabelleği geçmek, olabildiğince doldurmak ve aslında dolu olan bayt sayısını döndürmek ve daha fazlası varsa devam etmek gibi bir şey yapmak güzel olurdu.
TIdSchedulerOfFiber'in durumu nedir bir yana, bu çok ilginç görünüyor, işe yarıyor mu? Bunu kullanan var mı? Yine de Delphi 2009'un standart kurulumunda olmadığını fark ettim.
Güncelleme: Msg: = AContext.Connection.IOHandler.ReadLn (# 0, enUTF8); hangi işe yarıyor ama yine de yukarıdaki sorunun cevabını bilmek isterim, çünkü IO’yu engellemeye dayanıyor mu? Bu TIdSchedulerOfFiber üzerinde daha da istekli yapar.
, bir engelleme Readln bu tasarım gereğidir ve normal bir kullanıcı isteyeyim varsayalım; veya benzeri? Ayrıca bir pitty TIdSchedulerOfFiber üzerinde çalışılıyor değil, onun gelişimi konusunda bir gösteri stoper var mıydı? – Bruce
Oh CheckForDataOnSource (10) görüyorum; bir zaman aşımı var :-) – Bruce
Yukarıdaki gibi kod kullanarak ACBText.Connection.IOHandler.CheckForDataOnSource (10) hata ayıklayıcısında gördüğünüzde yanlış olarak döndürdüğümü buldum, veri olarak InputBuffer, bu bir hata mı yoksa orada mı kullanmam gereken başka bir ayar var mı? – Bruce