2011-07-07 16 views
7

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 

cevap

5

. OpenSSL, durum makinesinin arabelleğe alınmış ve işlenmeyi beklediği bekleyen baytları varsa SSL_pending() öğesinin belirtildiği bir durum makinesi kullanır. Hiçbir zaman SSL_read() numaralı telefonu aramayacağınız için, hiçbir veriyi ya da durum makinesini ilerletemezsiniz.

+7

SSL_pending belgelerine ilişkin belgeler bunu netleştirmez. –

+0

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" –

2

SSL_pending işlevi, 0'ın bir dönüş kodunu döndürürse, bu, SSL oturumunda okuma için hemen kullanılabilir bir veri olmadığı anlamına gelmez. 0'ın bir dönüş kodu, geçerli SSL veri kaydında daha fazla veri olmadığını gösterir. Ancak, zaten ağdan daha fazla SSL veri kaydı alınmış olabilir. SSL_pending işlevi 0 döndürme kodunu döndürürse, soketin okunabilir olup olmadığını kontrol etmek için seçim işlevini, soketin dosya tanımlayıcısını iletir. Okunabilir, soketteki ağdan daha fazla veri alındığı anlamına gelir.

İlgili konular