Этот код предназначен для сервера HTTPS, использующего блокирующие сокеты:
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 () всегда возвращает ноль, а SSL_read () никогда не достигается.Если вызов SSL_pending () удален, выполняется SSL_read ().Почему SSL_pending () не указывает, сколько байтов доступно?
Обратите внимание, что если вы вызываете SSL_read () и количество возвращаемых байтов меньше размера вашего буфера, вы прочитали все и сделали.
Если входящие данные превышают размер буфера, первый вызов SSL_read () заполняет буфер, и вы можете повторять вызов SSL_read (), пока не сможете заполнить буфер.
НО если входящие данные в точности кратны размеру вашего буфера, последний кусок данных заполняет буфер.Если вы попробуете другой SSL_read (), думая, что в блокирующем сокете может быть больше данных, он зависнет на неопределенное время.Отсюда и желание проверить SSL_pending () в первую очередь.И все же это не работает.
Как избежать зависания окончательного SSL_read ()?(Я не могу себе представить, что ответ должен быть неблокирующим, поскольку это означает, что вы никогда не сможете использовать SSL_read с блокировкой.)
ОБНОВЛЕНИЕ: Следующие работы.Очевидно, SSL_pending () не работает до тех пор, пока после первого SSL_read ():
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