I have setup my BIO to be non-blocking in my server. In my server I want
to use 'select' to detect when there is a connection available, but for
some reason it is not working. either select returns '-1' with errno set
to EINTR or select returns 0, but it has not waited for 2 seconds for a
connection. Maybe someone can give me an idea what I am doing wrong?
here is the code I am using:
void startListening(BIO* sock) {
int acceptSock = BIO_get_fd(sock, NULL);
int waitVal = 0;
fd_set rfds, wfds, efds;
struct timeval tv;
/* Wait up to two seconds. */
tv.tv_sec = 2;
tv.tv_usec = 0;
/* This is just one of the tests I have tried */
FD_ZERO(&rfds);
FD_SET(acceptSock, &rfds);
FD_ZERO(&wfds);
FD_SET(acceptSock, &wfds);
FD_ZERO(&rfds);
FD_SET(acceptSock, &efds);
do {
/* see if we have any activity on the socket */
waitVal = select(acceptSock, &rfds, &wfds, &efds, &tv);
if (waitVal < 0)
{
char* err = strerror(errno);
printf("select error: %s\n", err);
fflush(stdout);
return;
} if (waitVal > 0) {
BIO_do_accept(sock)
handleAccept(sock);
}
} while (waitVal == 0);
...
}
If I change this code to do a 'BIO_do_accept' and the call 'sleep(1)'
when 'BIO_do_accept' returns -1 and errno is EAGAIN it seems to work
fine. But that means my server could be sleeping when a request come in.
Any thoughts?
Thanks
Jim
p.s.
The BIO passed into the function above is created like this:
ret = BIO_new_accept(hostString);
if (ret != NULL)
{
/* set the accept socket to non-blocking */
BIO_set_nbio_accept(ret, 1);
/* set sockets created from this accept socket to
non-blocking */
BIO_set_nbio(ret, 1);
BIO_set_bind_mode(ret, BIO_BIND_REUSEADDR);
/* bind & listen */
val = BIO_do_accept(ret)
...
it is returned to a calling function which in turn calls startListening.
______________________________________________________________________
OpenSSL Project http://www.openssl.org
User Support Mailing List openssl-users@openssl.org
Automated List Manager [EMAIL PROTECTED]