Hi,

Thanx for the quick response. Unfortunately the same problem persists:

void conn_init_ssl(void)
{
   SSL_library_init();
   SSL_load_error_strings();
   global_ssl_context = SSL_CTX_new(SSLv23_client_method());
   SSL_CTX_set_mode(global_ssl_context,.
       SSL_MODE_ENABLE_PARTIAL_WRITE | SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER
                                     | SSL_MODE_AUTO_RETRY);
}

Any ideas? What should the underlying socket be blocking/not blocking? Can I have at the same time non-blocking read and blocking write?

BR,
Nikos

----- Original Message ----- From: "Kyle Hamilton" <aerow...@gmail.com>
To: <openssl-users@openssl.org>
Sent: Tuesday, March 31, 2009 3:13 AM
Subject: Re: SSL_write problem


SSL_CTX_set_mode(ssl, SSL_MODE_AUTO_RETRY);

2009/3/30 Nikos Balkanas <nbalka...@gmail.com>:
Hi,

I would like to ideally use non-blocking SSL_read and blocking SSL_write. Is
this possible with BIO_set_nbio? What should the underlying socket be in
that case?

If this is not possible, as I suspect, i have the problem that the
non-blocking SSL_write with select, will stallΒ afterΒ first SSL_error of
SSL_ERROR_WANT_READ || SSL_ERROR_WANT_WRITE without ever writing the data:

while(((select(fd + 1, NULL, &rset, NULL, &alarm)) > 0) && FD_ISSET(fd,
&rset))
{
Β Β Β Β Β res = SSL_write(ssl, input, len);
Β Β Β Β Β if (res == -1)
Β Β Β Β Β {
Β Β Β Β Β Β Β Β Β Β Β Β Β Β SSL_error = SSL_get_error(ssl, res);
Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β printf("SSL_error = %d\n", SSL_error);
Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β if (SSL_error != SSL_ERROR_WANT_READ && SSL_error !=
SSL_ERROR_WANT_WRITE)
Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β return(-1);
Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β else FD_CLR(fd, &rset);
Β Β Β Β Β Β }
Β Β Β Β Β Β else return(res);
}

My only solution so far has been to use the non-blocking SSL_write as a
blocking one, but it is terribly inefficient, looping as many as 50
timesΒ before writing the data:

while((ret = SSL_write(ssl, request->data, request->len)) < 0)
{
Β Β Β Β Β Β Β SSL_error = SSL_get_error(ssl, ret);
Β Β Β Β Β Β Β Β if (SSL_error != SSL_ERROR_WANT_READ && SSL_error !=
SSL_ERROR_WANT_WRITE)
Β Β Β Β Β Β Β Β Β Β Β Β Β Β break;
Β Β Β Β Β Β Β Β thr_yield();
}

Any ideas?
TIA, Nikos


:I®r¶Γ¥²�­¦1��¥²z¥²€Άy²�®Ά�z–

______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
User Support Mailing List                    openssl-users@openssl.org
Automated List Manager                           majord...@openssl.org

Reply via email to