Mã này là dành cho một máy chủ HTTPS sử dụng ổ cắm chặn:Tại sao cuộc gọi SSL_pending này luôn trả về 0?
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() luôn lợi nhuận bằng không và SSL_read() là không bao giờ đạt được. Nếu cuộc gọi SSL_pending() bị xóa, SSL_read() sẽ được thực hiện. Tại sao SSL_pending() không cho biết có bao nhiêu byte?
Lưu ý rằng nếu bạn gọi SSL_read() và số lượng byte được trả lại nhỏ hơn kích thước bộ đệm của bạn, bạn đã đọc mọi thứ và được thực hiện.
Nếu dữ liệu đến lớn hơn kích thước bộ đệm của bạn, lệnh SSL_read() đầu tiên sẽ lấp đầy bộ đệm và bạn có thể lặp lại gọi SSL_read() cho đến khi bạn không thể lấp đầy bộ đệm.
NHƯNG nếu dữ liệu đến là bội số chính xác của kích thước bộ đệm của bạn, đoạn dữ liệu cuối cùng sẽ lấp đầy bộ đệm. Nếu bạn cố gắng một SSL_read khác() suy nghĩ có thể có nhiều dữ liệu hơn trên một ổ cắm chặn, nó treo vô thời hạn. Do đó, mong muốn kiểm tra SSL_pending() trước tiên. Tuy nhiên, điều đó dường như không hoạt động.
Làm cách nào để tránh treo trên SSL_read cuối cùng()? (Tôi không thể tưởng tượng được câu trả lời là không bị chặn, vì điều đó có nghĩa là bạn không bao giờ có thể sử dụng SSL_read khi chặn.)
CẬP NHẬT: Các công việc sau đây. Rõ ràng SSL_pending() không hoạt động cho đến sau khi SSL_read đầu tiên():
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
Tài liệu về SSL_pending chắc chắn không làm rõ điều đó. –
Nó loại: "có được số byte có thể đọc được đệm trong một đối tượng SSL ... dữ liệu có thể được đệm bên trong ssl và sẵn sàng để truy xuất ngay lập tức với SSL_read (3)" –