On Tue, Aug 22, 2006 at 03:00:46PM +0200, Marek Marcola wrote:
> You may use select() but with some care.
> Simplest way is to:
> 1) wait on select()
> 2) read hit from SSL descriptor occur
> 3) read incrementally with SSL_read() from that descriptor until
> WANT_READ
> (or in other words - get all data from SSL read buffer)
> 4) go to select()
So does the following not-really-pseudocode look right (connobjs is
a linked list of connection objects)?
for(cp = connobjs; cp; cp = cp->next)
cp->want_write = false;
while(!quit) {
for(cp = connobjs; cp; cp = cp->next) {
if(cp->want_write || cp->output_buffer) {
/* either openssl wants to say something, or
* we want to send something */
FD_SET(cp->fd, &writefds);
} else {
FD_SET(cp->fd, &readfds);
}
}
select(maxfd + 1, &readfds, &writefds, NULL, &timeout);
for(cp = connobjs; cp; cp = cp->next) {
if(cp->want_write || cp->output_buffer) {
if(FD_ISSET(&cp->fd, &writefds) {
if(cp->output_buffer) {
byteswr = SSL_write(cp->sslobj,
cp->output_buffer,
cp->output_bufsz);
if(byteswr <= 0) {
err = ERR_get_error(cp->sslobj);
if(err == SSL_ERROR_WANT_WRITE)
cp->want_write = true;
} else {
remove_bytes_from_beginning_of_buffer(cp->output_buffer,
cp->output_bufsz);
}
}
}
}
}
}
You'll note I ignore SSL_ERROR_WANT_READ, because I am always
interested in if the server has anything to say, so I will always have
every fd in the readfds set _except_ when the last SSL error was
SSL_ERROR_WANT_WRITE.
This sound like it's probably a very FAQ. Once this is sorted out
is there somewhere I should send it to for inclusion?
Thanks,
Steve.
______________________________________________________________________
OpenSSL Project http://www.openssl.org
User Support Mailing List [email protected]
Automated List Manager [EMAIL PROTECTED]