Tengo una aplicación multiproceso que hace un uso intensivo de OpenSSL en C. Está diseñado con la idea de que se espera que todas sus conexiones SSL se bloqueen. Específicamente, bloqueando BIOs. Todos ellos se asignan de un solo puerto de entrada como esta:Cambiar un OpenSSL BIO del modo de bloqueo al modo sin bloqueo
ssl = SSL_new(ctx);
SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY);
sock = BIO_new_socket(socket, BIO_CLOSE);
SSL_set_bio(ssl, sock, sock);
como resulta, sin embargo, hay algunas pequeñas partes del código base donde el uso BIOs no-bloqueo sería la mejor opción. Las partes pequeñas que se beneficiarían de las BIO sin bloqueo no tienen forma de saber qué conexiones SSL les pertenecerán. Por lo tanto, siempre reciben BIO de bloqueo.
La pregunta es, ¿pueden los BIO de bloqueo ser no bloqueantes?
sé que BIO_set_nbio se puede utilizar para hacer una BIO no bloqueante pero la documentación dice:
se debe hacer la llamada a BIO_set_nbio() antes de establecer la conexión porque no bloqueo de E/S es establecido durante el proceso de conexión.
Otra posible opción que he pensado sería copiar el BIO y volver a crearlo, manteniendo de alguna manera todo el estado.
No entiendo el problema que tiene. Es razonable que IO no bloqueante esté configurado cuando se establece la conexión y seguramente puede abstraer su código de una manera que maneje eso. –
El problema es que es un _large_ cambio para que el IO no bloquee cuando se establece la conexión. – inthemedium