2011-07-07 48 views
7

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 

Trả lời

5

Bạn đang sử dụng SSL_pending() cách hoàn toàn sai. OpenSSL sử dụng một máy trạng thái, trong đó SSL_pending() cho biết nếu máy trạng thái có bất kỳ byte đang chờ xử lý nào đã được đệm và đang chờ xử lý. Vì bạn không bao giờ gọi SSL_read(), bạn sẽ không bao giờ đệm bất kỳ dữ liệu nào hoặc tiến lên máy trạng thái.

+7

Tài liệu về SSL_pending chắc chắn không làm rõ điều đó. –

+0

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

2

Nếu hàm SSL_pending trả về mã trả về là 0, điều đó không nhất thiết có nghĩa là không có sẵn dữ liệu ngay lập tức để đọc trên phiên SSL. Mã trả về là 0 cho biết không có thêm dữ liệu trong bản ghi dữ liệu SSL hiện tại. Tuy nhiên, nhiều bản ghi dữ liệu SSL hơn có thể đã được nhận từ mạng rồi. Nếu hàm SSL_pending trả về mã trả về là 0, hãy phát hành hàm chọn, chuyển qua bộ mô tả tệp của socket để kiểm tra xem socket có đọc được không. Có thể đọc được có nghĩa là đã nhận được nhiều dữ liệu hơn từ mạng trên ổ cắm.

Các vấn đề liên quan