【问题标题】:Can I call SSL_write() if SSL_read() is blocked for SSL_ERROR_WANT_READ?如果 SSL_read() 被 SSL_ERROR_WANT_READ 阻止,我可以调用 SSL_write() 吗?
【发布时间】:2016-10-21 14:00:38
【问题描述】:

我的程序是基于 OpenSSL(阻塞模式)开发的,我想将它重构为非阻塞的。它在具有 SSL 对象的线程中调用 SSL_read(),并在具有相同对象的另一个线程中调用 SSL_write()。

我从"Network Security with OpenSSL"一书中学习了OpenSSL非阻塞模式,这个模式有一个例子(data_transfer)。

for (;;)
{
    /* check the readability and writability */
    check_availability(A, &can_read_A, &can_write_A, B, &can_read_B, &can_write_B);

    /* write_waiton_read_A: SSL_write was blocked for SSL_ERROR_WANT_READ
     * write_waiton_write_A: SSL_write was blocked for SSL_ERROR_WANT_WRITE
     * read_waiton_write_A: SSL_read was blocked for SSL_ERROR_WANT_WRITE
     * read_waiton_read_A: SSL_read was blocked for SSL_ERROR_WANT_READ
     */

          /* not in the middle of a write on A */
    if (!(write_waiton_read_A || write_waiton_write_A) && 
            (A2B_len != BUF_SIZE) &&
            /* 
             * a. A is readable.
             * b. the read was blocked for "WANT_WRITE" and A 
             *    is writable  now.
             */
            (can_read_A || (can_write_A && read_waiton_write_A)))
    {
        read_waiton_read_A = 0;
        read_waiton_write_A = 0;

        code = SSL_read(A, A2B + A2B_len, BUF_SIZE - A2B_len);
        switch (SSL_get_error(A, code))
        {
            ...
        case SSL_ERROR_WANT_READ:
            read_waiton_read_A = 1;
            break;

         case SSL_ERROR_WANT_WRITE:
             read_waiton_write_A = 1;
             break;
            ...
        }
    }

    ...

          /* not in the middle of a read on A */
    if (!(read_waiton_write_A || read_waiton_read_A) &&
        have_data_B2A &&
        /*
         * a. A is writable.
         * b. the write was blocked for "WANT_READ" and A 
         *    is readable now.
         */
        (can_write_A || (can_read_A && write_waiton_read_A)))
    {
        write_waiton_read_A = 0;
        write_waiton_write_A = 0;

        code = SSL_write(A, B2A, B2A_len);
        switch (SSL_get_error(A, code))
        {
            ...
        case SSL_ERROR_WANT_READ:
            write_waiton_read_A = 1;
            break;

        case SSL_ERROR_WANT_WRITE:
            write_waiton_write_A = 1;
            ...
        }
    }

    ...
}

我从上面的代码中得出结论,如果 SSL_ERROR_WANT_READ 被阻止,我必须等待 SSL_read() 完成,虽然 A 在这种情况下是可写的,但我无法调用 SSL_write()。

对吗?我希望我的程序可以同时读取和发送数据,如果 SSL_read() 因 SSL_ERROR_WANT_READ 而被阻止,我可以调用 SSL_write() 吗?

非常感谢任何帮助。提前非常感谢。

【问题讨论】:

    标签: ssl openssl nonblocking


    【解决方案1】:

    你可以试试,但你会再次得到SSL_WANT_READ

    很难理解你为什么要考虑这个。

    【讨论】:

    • 我知道 SSL_read() 如果因 SSL_ERROR_WANT_READ 而被阻止,它将再次获得 SSL_WANT_READ。如果 SSL_read() 被阻止, SSL_write() 怎么样?我的程序的连接是长寿命的,我想将数据写入 SSL 实例,虽然它在 SSL_read() 中被阻止,所以吞吐量不会降低。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-26
    • 1970-01-01
    • 1970-01-01
    • 2021-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多