![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
SSL de forma asíncrona usando LibreSSL o OpenSSL(cogido de un email de Darío a Carlos, modificado para que se entienda mejor)La investigación sobre de sockets no bloquantes con SSL se hizo en el dgrpssl: 3.0.1.3:/home/dario/Programacion/dgrpssl/dgrpssl.c No usa las funciones BIO* La parte importante para poder usar SSL de manera no bloqueante es lo que mencionan aquí: With non-blocking sockets, SSL_WANT_READ means "wait for the socket to be readable, then call this function again."; conversely, SSL_WANT_WRITE means "wait for the socket to be writeable, then call this function again.". You can get either SSL_WANT_WRITE or SSL_WANT_READ from both an SSL_read() or SSL_write() call. Básicamente:
Dicho de otra manera: El caso que no suele estar contemplado en los ejemplos sencillos de internet es que un SSL_write() puede devolver 0 y al mirar el error con un SSL_get_error() decirte que SSL_WANT_READ. Eso significa que para poder hacer la escritura necesitas que el socket haya notificado que tenga cosas para leer (ya sea porque está rotando las claves, o reinicializando la conexión SSL o alguna otra cosa). No sé si las funciones BIO* permiten hacer escrituras asíncronas. Tendría que verificar que el código del programa que he mencionado arriba está bien y que SSL_write() funciona de esa manera y no se requiere un SSL_read(), pero con estos datos se puede implementar perfectamente un programa que tenga cientos de conexiones simultáneas con SSL y que SSL no va a bloquear al hacer lecturas o escrituras. En el programa de arriba creo que suponía que tanto un SSL_read() como un SSL_write() valían para "desbloquear" la escritura por SSL_WANT_READ de un SSL_write. Lo dicho, tendría que verificarlo otra vez -- Darío. |