socket que program how c++ sockets ssl openssl nonblocking

c++ - program - La conexión OpenSSL falla con un socket no bloqueante



sockets en c linux pdf (0)

Tengo un servidor OpenSSL que tiene la funcionalidad echo como se describe aquí y un cliente como se describe aquí . Hice algunos cambios menores en el servidor (por ejemplo, cambiando las rutas certifiacte y clave privada, agregando algunas salidas de depuración, ...) y en el cliente acabo de eliminar el "BIO * out" e imprimí el resultado BIO_read a la consola . Además, tanto el cliente como el servidor usan TLSv1_1_client_method y TLSv1_1_server_method, respectivamente.

Los códigos funcionan bien juntos, pero si agrego "BIO_set_nbio (web, 1);" para el cliente justo antes de BIO_do_connect, la conexión ya no funciona. BIO_do_connect devuelve -1. ¿Esto puede ser un problema de apretón de manos y, de ser así, cómo puedo apretón de manos correctamente con tomas sin bloqueo?

Este error ocurrió por primera vez en un proyecto mío más grande. Acabo de usar los códigos de ejemplo para verificarlo. Mi problema es que necesito conectores que no sean de bloqueo, porque estoy llamando a BIO_read desde un hilo diferente y no puedo unirme al hilo si está atascado tratando de leer.

También traté de configurar el socket en no-bloqueo usando fd_set y select, pero eso arroja el error WSAENOTSOCK (10038). Hice lo siguiente:

Encabezamiento:

BIO* _bio; SSL* _ssl; FD_SET _fdSet; SOCKET _socket; timeval t;

en la conexión:

_bio = BIO_new_ssl_connect(_ctx); BIO_get_ssl(_bio, &_ssl); SSL_set_mode(_ssl, SSL_MODE_AUTO_RETRY); BIO_set_conn_hostname(_bio, _address); // _address is "hostname:port" int connectResult = BIO_do_connect(_bio); // ... error handling for connect, certificate verification BIO_get_fd(_bio, _socket); FD_ZERO(&_fdSet); FD_SET(_socket, &_fdSet); t.tv_sec = 2; t.tv_usec = 0;

En el hilo que sondea el socket:

int selectResult = select(0, &fdSet, NULL, NULL, &t); // <-- throws WSAENOTSOCK if (selectResult > 0) x = BIO_read(_bio, &buf, 1);

¿Se puede seleccionar incluso si tiene una toma BIO?

El cliente está en Windows 7 64 Bit, el servidor se ejecuta en Ubuntu 64 bit en una VM en el mismo host que mi Windows 7.