qual é a diferença entre BIO_read / BIO_write e SSL_read / SSL_write quando os BIOs são BIOs de memória e não soquete BIOs?

Estou confuso sobre a diferença entre as rotinas BIO BIO_read () / BIO_write () e SSL_read () / SSL_write () quando os BIOs são BIOs de memória e não soquete BIOs.

Estou tentando codificar um servidor WebRTC usando libnice para a pilha ICE e openssl para a pilha DTLS. A pilha ICE possui a conexão de soquete com o cliente, portanto não posso usar os BIOs baseados em soquete no openssl. Em vez disso, estou usando os BIOs de memória.

Portanto, o procedimento de alto nível que estou usando é que, quando recebo as mensagens DTLS do cliente no soquete ICE, escrevo essa mensagem na pilha DTLS usando BIO_write (). Então, quando a pilha DTLS tem uma mensagem para enviar ao cliente, recebo essa mensagem usando o BIO_read () e a envio ao cliente usando o soquete ICE.

Eu já vi alguns exemplos de código fonte que fazem essencialmente esse procedimento, mas eles também chamam a rotina SSL_read () após a chamada BIO_write (). Isso não faz sentido para mim. Por que a chamada para SSL_read () é necessária depois que eu essencialmente escrevi a mensagem do cliente na pilha DTLS usando a chamada BIO_write ()? Se eu não chamar SSL_read () após o BIO_write (), meu código não funcionará. Mas quando ligo para SSL_read () após o BIO_write (), isso é realmente trocar as mensagens de handshake com o cliente do navegador.

Pergunta: usando BIOs de memória, qual é a diferença entre BIO_read () e SSL_read (); Pergunta: usando BIOs de memória, qual é a diferença entre BIO_write () e SSL_write ()? Pergunta: a BIO de memória padrão está bloqueando ou não bloqueando? Suponho que não seja bloqueador, pois é uma BIO baseada em memória e não uma BIO baseada em soquete.

Obrigado, -Andres

questionAnswers(1)

yourAnswerToTheQuestion