Почему SSL_pending возвращает 0 после того, как SSL_read читает 1400 байт? - PullRequest
1 голос
/ 03 сентября 2011
while(1)
{
    read_blocked_on_write=0;

    const int buff_len = 1024;
    char buff[buff_len];

    iResult = SSL_read(ssl, buff, buff_len);

    int ssl_err = SSL_get_error(ssl, iResult);
    if(ssl_err == SSL_ERROR_NONE)
    {
        if(offset + iResult > recvbuflen - 1)
        {
            FD_ZERO(&fdread);
            FD_ZERO(&fdwrite);
            MessageBox(hwnd, TEXT("ERROR"), TEXT("Not enough memory!"), MB_OK | MB_ICONERROR);
            return 1;
        }
        memcpy(recvbuf + offset, buff, iResult);
        offset += iResult;
        if(SSL_pending(ssl))
        {
            continue;
        }
        else
        {
            bFinish = true;
            break;
        }
    }
    else if(ssl_err == SSL_ERROR_ZERO_RETURN)
    {
        bFinish = true;
        break;
    }
    else if(ssl_err == SSL_ERROR_WANT_READ)
    {
        break;
    }
    else if(ssl_err == SSL_ERROR_WANT_WRITE)
    {
        /* We get a WANT_WRITE if we're
        trying to rehandshake and we block on
        a write during that rehandshake.

        We need to wait on the socket to be 
        writeable but reinitiate the read
        when it is */
        read_blocked_on_write=1;
        break;
    }
    else
    {
        FD_ZERO(&fdread);
        FD_ZERO(&fdwrite);
        MessageBox(hwnd, TEXT("ERROR"), TEXT("SSL problem!"), MB_OK | MB_ICONERROR);
        return 1;
    }
}

1 Ответ

1 голос
/ 03 сентября 2011

Я не эксперт по ssl, но, скорее всего, потому что нечего читать. Вы читаете и перемещаете буфер (который занимает максимум миллисекунды), а затем завершаете работу, если в этот момент больше нечего читать. Между тем вы имеете дело с гораздо более медленными скоростями сети и расшифровкой на нижнем уровне. Совсем не исключено, что в этот момент нечего возвращать.

Почему там вообще есть эта проверка? Не будет ли альтернативное открытие сокета неблокирующим, если вы пытаетесь мультиплексировать или что-то еще?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...