Hello, I can't figure out how OpenSSL connections work.
I would like to use 2 bios (rbio, wbio) which will be shared for all my connections. The problem is that I really don't understand the error messages. I never get an SSL_ERROR_WANT_WRITE error code, I only get SSL_ERROR_WANT_READ. For example, for the handshake, whether I have to send or receive data, I only receive the error SSL_ERROR_WANT_READ. (calls are blocking for simplicity) int main() { struct addrinfo hints, *result; memset(&hints, 0, sizeof(struct addrinfo)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; if (getaddrinfo("google.com", "443", &hints, &result) != 0) { printf("getaddrinfo error"); exit(1); } int fd = -1; for (; result != nullptr; result = result->ai_next) { fd = socket(result->ai_family, result->ai_socktype, result->ai_protocol); if (fd < 0) continue; int res = connect(fd, result->ai_addr, result->ai_addrlen); if (res == -1) { continue; } break; } if (fd < 0) { printf("Connection error"); exit(1); } freeaddrinfo(result); SSL_library_init(); OpenSSL_add_all_algorithms(); SSL_load_error_strings(); ERR_load_BIO_strings(); ERR_load_crypto_strings(); SSL_CTX *ctx = SSL_CTX_new(SSLv23_method()); BIO *rbio = BIO_new(BIO_s_mem()); BIO *wbio = BIO_new(BIO_s_mem()); SSL *ssl = SSL_new(ctx); SSL_set_bio(ssl, rbio, wbio); SSL_set_connect_state(ssl); int n; do { n = SSL_do_handshake(ssl); n = SSL_get_error(ssl, n); if (n == SSL_ERROR_WANT_READ) { char buffer[4096]; int r = BIO_read(wbio, buffer, sizeof(buffer)); int error = SSL_get_error(ssl, r); if (error == SSL_ERROR_WANT_READ) { r = read(fd, buffer, sizeof(buffer)); BIO_write(rbio, buffer, r); } else { send(fd, buffer, r, 0); } } } while (n != SSL_ERROR_NONE); printf("Connected"); } How to manage the connection (with several sockets on the same bios) if I don't know if I have to send data or receive it according to the error message? Thank you