>
> If OpenSSL is unable to perform an operation, that means it tried it and
> couldn't do it. If that operation was a write, then when it becomes possible,
> you will get a write event. If that operation wasn't a write, then who cares
> when a write becomes possible?
>
Maybe I show it using simple pseudocode (arguments to functions are not exactly
as in real implementation and some function are simplifed versions of real one,
some functions are omitted):
<--- PSEUDO CODE -------->
bool WaitOnWrite = false;
int res;
// it associates FD_WRITE event with SockEvent object
WSAEventSelect(sock,SockEvent,FD_WRITE);
for (;;)
{
if (WaitOnWrite)
WaitForMultipleObjects(SockEvent)
else
WaitForMultipleObjects(UserEvent);
res = SSL_write(sock,userBuf,len);
res = SSL_get_error(sock,res);
switch(res)
{
case SSL_ERROR_NONE:
WaitOnWrite = false;
break;
case SSL_ERROR_WANT_WRITE:
WaitOnWrite = false;
break;
}
}
<--- PSEUDO CODE END -------->
The code above works like this: When it starts it waits for data from user
(user signals when he wants to send some data by setting UserEvent), then
SSL_write sends data from userBuf, if SS_write will success then procedure is
repeated if not program will wait for FD_WRITE event to occur. But
unfortunately it can deadlock. Why? Because there is clearly specified in
windows help that FD_WRITE event only will be send if previous invoke of 'send'
function will fail with WSAEWOULDBLOCK error. (if you don't issue 'send' or
'send' will fail from other reason, FD_WRITE will not be send!). So I have to
know, what reason 'SSL_write' failed or I can deadlock. If i use nonencrypted
connection(Winsock API) it's not a problem. After 'send' command I can check
error by using 'GetLastError'command. But if I use OpenSSL ('SSL_write'
replaces 'send') the only message I will get is SSL_ERROR_WANT_WRITE. SSL_write
can internaly issue 'send' a couple of times, it can clear or modify windows
last error code, SSL_ERROR_WANT_WRITE can be generated from other reason then
underlaying winsock failur (internal OpenSSL logic), finally 'send' may fail
from other reason then WSAEWOULDBLOCK. Now, I hope, it's clear for you.
Conclusion:
OpenSSL is designed to work with 'select' statement. In windows environment
'select' can not be used, and native windows API for waiting on multiple
objects seems to be incompatibile with openSSL (i should rather say OpenSSL is
incompatibile with windows). Writing applications that perform asynchronous IO
operations (interleaving input and outputs) seems to questionable. That's my
opinion - nobody shows me working code so far.(timeouts and polling are rather
for testing then for serious code)
>
> I don't get it. Why are you back on how to tell when a socket event occured?
> I thought you had solved that problem by using events.
>
No,no. All the time i've tried to show you that I haven't. I have said that I
have an idea, but this is only my idea, it's not simple using of windows events
but rather special mixing windows events with 'select' statements, it has
rather complex logic, it has several drawbacks (in normal usage it generates
sometimes some unnecessary function invokations and when something goes wrong i
have to kill the thread or close connection from other (but i have to do it in
reason of serious failure, not normal usage)) and this is connected with logic
of my application (for other purpouses this method is not suitable - especially
for server code). If I have no choice i will use it, but it's always worth to
try something better...
Lucas
______________________________________________________________________
OpenSSL Project http://www.openssl.org
User Support Mailing List [email protected]
Automated List Manager [EMAIL PROTECTED]