En una aplicación de servidor más grande, tengo un hilo con un servidor OpenSSL básico que usa BIO en modo de bloqueo porque parecía la forma más sencilla. Mi código acepta un solo tipo de solicitud de un teléfono (Android o iOS, y no estoy escribiendo ese código) y devuelve una cadena hexadecimal envuelta en HTML básico (que describe parte del estado de mi servidor). Opté por SSL y un servidor psuedo-HTTPS porque eso facilita las cosas para el desarrollador del teléfono. Si hay algo en la solicitud que el servidor no entiende, devuelvo un 404. Todo esto funciona.
El problema : cuando mi servidor se apaga, este hilo no se cierra debido al bloqueo de la llamada BIO_do_accept.
Probé BIO_get_fd() y setsockopt() para poner un tiempo de espera en el socket subyacente, pero aún se bloquea. De manera algo preocupante, SSL_state () permanece en "antes de/aceptar la inicialización", pero repetir eso obviamente no funcionará.
Supongo que otras personas tienen un código de servidor como este, y esos servidores pueden cerrarse correctamente. ¿Cómo lo hacen? ¿Hay alguna forma de que otro subproceso rompa ese bloque y obtenga la llamada de aceptación para regresar con un error? ¿O tengo que abandonar la idea de bloquear llamadas y pasar por la aparentemente horrible versión sin bloqueo ?
Cuando mi servidor se apaga, este hilo no se cierra debido a la llamada de bloqueo BIO_do_accept.
Para detener el bloqueo, cierre el zócalo asociado. Volverá inmediatamente.
Realice el apagado desde su controlador de señal.
No haga nada más en el controlador de señales con respecto a OpenSSL porque no es seguro para señales asíncronas. Deje que el hilo principal se limpie una vez que su hilo de trabajo haya regresado. Consulte, por ejemplo, libcrypto Thread Safety .