i am hoping win32 developers can lend out a hand. i cannot determine
how to handle SSL_read and SSL_write using WSAAsyncSelect.
for example:
if i create a socket, and register it with WSAAsyncSelect for
FD_READ and FD_WRITE, i can generate a windows' message map
like the following:
[in this not so real world example, lets say when i want to send
something, szSendBuf is "magically" filled, and szRecvBuf will
be "magically" filled.]
=============================================
LRESULT CALLBACK SockWndProc(HWND hwnd, UINT uiMsg, WPARAM wParam, LPARAM
lParam)
{
SOCKET hSock;
WORD wWSAEvent, wWSAErr;
static char szRecvBuf[1024];
static char szSendBuf[5][1024]; // queue of 5 items.
switch (uiMsg)
{
case WM_WSANOTIFY:
hSock = static_cast<SOCKET>(wParam);
wWSAEvent = WSAGETSELECTEVENT(lParam);
wWSAErr = WSAGETSELECTERROR(lParam);
switch (wWSAEvent)
{
case FD_READ:
... do something with SSL_read here such as
if (SSL_pending())
SSL_read(m_ssl, szRecvBuf, 1024)
break;
case FD_WRITE:
if (sendqueue.getLength() > 0)
... do something with SSL_write here
SSL_write(m_ssl, szSendBuf, 1024)
break;
}
break;
...
}
return DefWindowProc(hwnd, uiMsg, wParam, lParam);
}
=============================================
here is where i get stumped.
1) should i first check wWSAErr for WSAEWOULDBLOCK, or
not do this after a call to SSL_read? or do it at all?
2) if i call SSL_read, and it generates an error, that SSL_get_error
later reports as
- SSL_ERROR_WANT_WRITE
do i just break out of the FD_READ case
or should i loop here and keep calling SSL_read?
if i break the case statement, will it be guaranteed
that FD_READ will be triggered again or should i explicitly
loop here to keep calling call SSL_read over again?
- SSL_ERROR_WANT_READ...same as above?
2.5) the same questions go for SSL_write and FD_WRITE. if i first
call SSL_write(m_ssl, buf, sizeof(buf)) and it returns WANT_READ/WRITE,
should i explicitly call SSL_write again, or wait for FD_WRITE to
be triggered again?
3) if SSL_read can cause write operations, how do i know that the
FD_WRITE which would be triggered is fired because i wanted asked to
send something, not a side effect from SSL_read? or does it even matter
that i was receiving something with SSL_read, it caused a write op,
firing FD_WRITE, and i have something queued up to send that it
starts sending the item in the queue
4) does anyone have any samples or urls for samples they would like to
share
for non-blocking win32 sockets with SSL?
TIA
jeff
[EMAIL PROTECTED]
______________________________________________________________________
OpenSSL Project http://www.openssl.org
User Support Mailing List [EMAIL PROTECTED]
Automated List Manager [EMAIL PROTECTED]