I've attached the BC++ code for a non-blocking SSL client under windows.
This is working fine for me now, although I would love to hear suggestions
on improvement...
-- Jeff.
-----
Jeff Magnusson ([EMAIL PROTECTED])
River Styx Internet
> -----Original Message-----
> From: [EMAIL PROTECTED]
> [mailto:[EMAIL PROTECTED]]On Behalf Of Amit Chopra
> Sent: May 13, 2000 5:51 AM
> To: [EMAIL PROTECTED]
> Subject: Re: Another non-blocking question
>
>
> Hi,
> My earlier version seemed to be somewhat buggy. Sorry.
> Here is a fixed one :). I changed WANT_WRITE case to do
> SSL_read again. As I undertsand SSL_read can result in
> WANT_WRITE meaning it wants to write something but failed
> (due to an underlying wouldblock maybe).
> A simple solution would be to call SSL_read again. OR you
> could wait on the the socket becoming writable.
> I have marked the changes like this: CHANGED.
>
> .....
> .....
> WSAEventSelect( iSocketID, m_hSocketEvent, FD_READ|FD_CLOSE);
>
> while(1)
> {
> int iResult = WSAWaitForMultipleEvents( 1, &m_hSocketEvent,
> FALSE,INFINITE, FALSE );
> if( iResult == WSA_WAIT_EVENT_0 )
> {
> WSANETWORKEVENTS networkEvents;
> iRetCode = WSAEnumNetworkEvents(iSocketID, m_hSocketEvent,
> &networkEvents);
> long lEvents = networkEvents.lNetworkEvents;
> if(lEvents & FD_CLOSE) //close
> {
> //cleanup and break;
> }
> //Assuming an active read is all you wanna do
> //CHANGED
> if(lEvents & FD_READ)
> {
> int readBytes = Read(szBuffOut,sizeof(szBuffOut));
> if(readBytes > 0) //application data
> {
> //do whatever processing
> }
>
> if(readBytes == -2) //error terminate connection
> {
> //cleanup and break;
> }
> //if readBytes == -1 then go back to WaitFor...
> //I think SSL_read returns zero when it reads handshake
> //data so we really donot have to bother about it
> //(This comments makes sense when u do an implicit accept)
> continue;
> }
> } //end of if (WAIT_OBJ...
> } //end of while
> ....
>
>
>
>
> //Returns -2 if error,-1 if wait, otherwise bytes read,
> Read(char* szBuffOut, int size )
>
> doRead:
> int iErr = SSL_read(m_sslconn, szBuffOut, size);
> if( iErr >= 0) //read bytes, could be handshake as well
> return iErr; //return bytes Read
> else
> {
> int iLastErr = SSL_get_error( m_sslconn, iErr );
> //CHANGED
> if( iLastErr == SSL_ERROR_WANT_READ )
> return -1;
> if( iLastErr == SSL_WANT_WRITE)
> //Assuming that WANT_WRITE shall be relatively rare
> //So should not really hog CPU time
> goto doRead;
>
> //SSL_ERROR_ZERO_RETURN is actually closure alert, the others
> //are other errors
> //CHANGED typo error last time.
> if ( iLastError == SSL_ERROR_ZERO_RETURN ||
> iLastError == SSL_ERROR_SYSCALL ||
> iLastError == SSL_ERROR_SSL )
> return -2;
> } //end of else
> } //end of read
>
>
> This time I hope this is correct and helpful.
> If something wrong could anyone point it out?
> Are my assumptions correct?
>
> Amit.
> ______________________________________________________________________
> OpenSSL Project http://www.openssl.org
> Development Mailing List [EMAIL PROTECTED]
> Automated List Manager [EMAIL PROTECTED]
>
tempsslclient.cpp