Dai commenti vedo che il tuo "half-duplex" si riferisce al fatto, che non devi operare sullo stesso oggetto SSL da thread diversi allo stesso tempo (o usare il lock esplicito) e quindi non puoi usare SSL_read e SSL_write allo stesso tempo da diversi thread.
Mentre la maggior parte dei protocolli sono richieste / risposte e quindi non hanno bisogno di leggere e scrivere in parallelo, il solito modo per raggiungere quello che vuoi è con I / O non bloccante e selezionare. Funziona in modo simile a I / O non bloccanti con socket normali. Ci sono due principali differenze:
- Potrebbero esserci stringhe di mano SSL all'interno di SSL_read e SSL_write, quindi un SSL_read potrebbe dover scrivere dati e SSL_write potrebbe aver bisogno di leggere i dati. Quindi è necessario verificare le condizioni ERROR_SSL_WANT_READ e ERROR_SSL_WANT_WRITE. Lo stesso con SSL_connect e SSL_accept.
- SSL_read restituisce solo la quantità di dati richiesta, ma potrebbero esserci più dati nel frame SSL. In questo caso i dati sono memorizzati internamente all'interno dell'oggetto SSL e non si otterrà da una chiamata per selezionare che ci sono più dati (perché hanno già letto dal socket). Devi verificare questo caso con SSL_pending, o assicurarti di provare sempre a leggere la quantità massima di dati che si adatta a un frame SSL (16k).
E per i filosofi che cucinano: hai questo tipo di problema solo con i fili. Con single-threaded non hai bisogno di essere bloccato e quindi non hai problemi di blocco (il che spesso rende il codice più veloce anche a causa della mancanza di conflitti).