------=_Part_2442_11558566.1206061024617
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

On Thu, Mar 20, 2008 at 6:51 PM, David Schwartz
wrote:

>
> ready_sockets = ::select(m_max_socket + 1, rfds, 0, 0,&tv);
> if (ready_sockets > 0)
> {
> if (FD_ISSET(s->get_sock(),p->get_rfds()))
> {
> new_s->set_non_blocking(true);
> if (s->accept(new_s))
> {
> call the code above which will call SSL_accept
> }
> else
> {
> /*error handling*/
> }
>
> Where is the call to 'accept' (the system's 'accept')? Did you cut out a
> line before 'new_s->set_non_blocking'? Is 's->accept(new_s)' a wrapper
> around 'accept'? Can you paste the code to this wrapper?



Yes the 's->accept(new_s)' is a wrapper around the system 'accept'. Here is
the code for it:


bool csocket::accept ( csocket * new_socket ) const
{
int addr_length = sizeof ( m_addr );
new_socket->m_sock_fd = ::accept ( m_sock_fd, ( sockaddr * ) &m_addr, (
socklen_t * ) &addr_length );
if ( new_socket->m_sock_fd <= 0 )
{
return false;
}
else
{
return true;
}
}

So as you can see if accept returns EMFILE or ENFILE, I go immediately to
the "error handling" section.


I have added BIO_set_nbio call to my code following your advice :

m_sbio = BIO_new_socket(m_sock_fd, BIO_NOCLOSE);
BIO_set_nbio(m_sbio,1);
SSL_set_bio(m_ssl, m_sbio, m_sbio);


Unfortunately this did not make a difference and SSL_accept still hangs,
sometimes after processing more than a 1000 clients...

Thanks again.


>
>
> > I am setting the socket as non blocking by simply calling:

>
> if (fcntl(m_sock_fd, F_SETFL, O_NONBLOCK) == -1)
> {
> return false;
> }
>
> This does not make the BIO non-blocking. That may or may not matter, but
> to
> tell I need to see where the actual call to the system's 'accept' function
> is taking place. And you still haven't pasted that code.
>
> > I am confused when you say if my BIO is non-blocking too.
> > I thought that it is non blocking since the underlying socket
> > is non blocking. Is this a wrong assumption? if so how can I make
> > the BIO non blocking [BIO_set_nbio?]

>
> Right. A blocking BIO with a non-blocking socket can cause serious
> problems.
>
> Where is the actual call to 'accept' to accept the connection? What
> happens
> if 'accept' returns EMFILE or ENFILE?
>
> DS
>
>
> __________________________________________________ ____________________
> OpenSSL Project http://www.openssl.org
> User Support Mailing List openssl-users@openssl.org
> Automated List Manager majordomo@openssl.org
>


------=_Part_2442_11558566.1206061024617
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Content-Disposition: inline



On Thu, Mar 20, 2008 at 6:51 PM, David Schwartz <davids@webmaster.com> wrote:



     ready_sockets = ::select(m_max_socket + 1, rfds, 0, 0,&tv);

     if (ready_sockets > 0)

     {

        if (FD_ISSET(s->get_sock(),p->get_rfds()))

        {

           new_s->set_non_blocking(true);

           if (s->accept(new_s))

           {

                      call the code above which will call SSL_accept

           }

           else

           {

            /*error handling*/

           }



Where is the call to 'accept' (the system's 'accept')? Did you cut out a

line before 'new_s->set_non_blocking'? Is 's->accept(new_s)' a wrapper

around 'accept'? Can you paste the code to this wrapper?

Yes the 's->accept(new_s)' is a wrapper around the system 'accept'. Here is the code for it:


bool csocket::accept ( csocket * new_socket ) const

{
    int addr_length = sizeof ( m_addr );
    new_socket->m_sock_fd = ::accept ( m_sock_fd, ( sockaddr * ) &m_addr, ( socklen_t * ) &addr_length );
    if ( new_socket->m_sock_fd <= 0 )
    {

        return false;
    }
    else
    {
        return true;
    }
}

So as you can see if accept returns EMFILE or ENFILE, I go immediately to the "error handling" section.



I have added BIO_set_nbio call to my code following your advice :

          m_sbio = BIO_new_socket(m_sock_fd, BIO_NOCLOSE);
        BIO_set_nbio(m_sbio,1);
          SSL_set_bio(m_ssl, m_sbio, m_sbio);



Unfortunately this did not make a difference and SSL_accept still hangs, sometimes after processing more than a 1000 clients...

Thanks again.
 





> I am setting the socket as non blocking by simply calling:



               if (fcntl(m_sock_fd, F_SETFL, O_NONBLOCK) == -1)

               {

                       return false;

               }



This does not make the BIO non-blocking. That may or may not matter, but to

tell I need to see where the actual call to the system's 'accept' function

is taking place. And you still haven't pasted that code.



> I am confused when you say if my BIO is non-blocking too.

> I thought that it is non blocking since the underlying socket

> is non blocking. Is this a wrong assumption? if so how can I make

> the BIO non blocking [BIO_set_nbio?]



Right. A blocking BIO with a non-blocking socket can cause serious problems.



Where is the actual call to 'accept' to accept the connection? What happens

if 'accept' returns EMFILE or ENFILE?



DS





__________________________________________________ ____________________

OpenSSL Project                                 http://www.openssl.org

User Support Mailing List                    penssl-users@openssl.org">openssl-users@openssl.org

Automated List Manager                           majordomo@openssl.org




------=_Part_2442_11558566.1206061024617--
__________________________________________________ ____________________
OpenSSL Project http://www.openssl.org
User Support Mailing List openssl-users@openssl.org
Automated List Manager majordomo@openssl.org