Bu kod engelleme soketleri kullanarak bir HTTPS sunucusu için geçerli:Bu SSL_pending çağrısı neden her zaman sıfırdan çıkıyor?
request := '';
start := gettickcount;
repeat
if SSL_pending(ssl) > 0 then
begin
bytesin := SSL_read(ssl, buffer, sizeof(buffer)-1);
if bytesin > 0 then
begin
buffer[bytesin] := #0;
request := request + buffer;
end
else break; // read failed
end; // pending
until (gettickcount - start) > LARGETIMEOUT;
// "request" is ready, though possibly empty
SSL_pending() daima sıfırla döner ve SSL_read() ulaştı asla. SSL_pending() çağrısı kaldırılırsa, SSL_read() gerçekleştirilir. SSL_pending() neden kaç bayt olduğunu gösterir?
SSL_read() işlevini çağırırsanız ve döndürülen bayt sayısı arabellek boyutunuzdan daha azsa, her şeyi okursanız ve bittiğini unutmayın.
Gelen veriler arabellek boyutunuzdan daha büyükse, ilk SSL_read() çağrısı arabelleği doldurur ve arabelleği dolduramayacak kadar SSL_read() çağrısını tekrarlayabilirsiniz.
BUT Gelen veriler, arabellek boyutunuzun tam bir katıysa, son veri yığını arabelleği doldurur. Başka bir SSL_read() işlevini denerseniz, engelleme yuvasında daha fazla veri olabileceğini düşünürseniz, süresiz olarak askıda kalıyor. Bu yüzden önce SSL_pending() kontrol etme isteği. Yine de bu işe yaramıyor.
Son bir SSL_read() üzerinde asılı kalmamak nasıl? (Yanıtın engellemeyi engellemediğini düşünemiyorum, çünkü SSL_read'i engelleme ile asla kullanamayacağınız anlamına gelir.)
UPDATE: Aşağıdaki çalışmalar. Anlaşılan ilk SSL_read() sonrasına kadar çalışmıyor() SSL_pending: Sen SSL_pending()
tamamen yanlış bir yol kullanıyor
request := '';
repeat
bytesin := SSL_read(ssl, buffer, sizeof(buffer)-1);
if bytesin > 0 then
begin
buffer[bytesin] := #0;
request := request + buffer;
end
else break; // read failed
until SSL_pending(ssl) <= 0;
// "request" is ready, though possibly empty
SSL_pending belgelerine ilişkin belgeler bunu netleştirmez. –
Böyle bir şey: "bir SSL nesnesinde arabelleğe alınan okunabilir baytların sayısını elde et ... veri ssl içinde arabelleğe alınabilir ve SSL_read (3) ile hemen alınmaya hazırdır" –