Modello OpenSSL Client per comunicazione half duplex tramite socket

1

Ho letto in questa domanda SO che la comunicazione socket OpenSSL può essere solo half duplex in un singolo thread.

Supponendo che quello che ho letto sia vero, mi chiedo se posso applicare il problema di dining di philosopher per inviare SSL_write () e ricevere SSL_read () su un socket non bloccante in un singolo thread che comunica con un server TCP OpenSSL. Sia il server che il client sono non bloccanti.

Sarebbe un buon modello? O dovrei sempre impostare la priorità per leggere SSL_read ()? Quale sarebbe l'approccio migliore al codice?

Sto usando C ++ per codificare questo modello di socket non bloccante a singolo thread (senza BOOST o altre librerie).

    
posta enthusiasticgeek 07.07.2014 - 01:19
fonte

1 risposta

2

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).

    
risposta data 07.07.2014 - 06:43
fonte

Leggi altre domande sui tag