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