Mein Programm wurde basierend auf dem OpenSSL (Blocking Mode) entwickelt, ich möchte es zu einem nicht-blockierenden umgestalten. Es ruft SSL_read() in einem Thread mit einem SSL-Objekt auf und ruft SSL_write() in einem anderen Thread mit demselben Objekt auf.Kann ich SSL_write() aufrufen, wenn SSL_read() für SSL_ERROR_WANT_READ blockiert ist?
Ich habe den OpenSSL non-blocking mode aus dem Buch "Network Security with OpenSSL" untersucht, es gibt ein Beispiel (data_transfer) für diesen Modus.
for (;;)
{
/* check the readability and writability */
check_availability(A, &can_read_A, &can_write_A, B, &can_read_B, &can_write_B);
/* write_waiton_read_A: SSL_write was blocked for SSL_ERROR_WANT_READ
* write_waiton_write_A: SSL_write was blocked for SSL_ERROR_WANT_WRITE
* read_waiton_write_A: SSL_read was blocked for SSL_ERROR_WANT_WRITE
* read_waiton_read_A: SSL_read was blocked for SSL_ERROR_WANT_READ
*/
/* not in the middle of a write on A */
if (!(write_waiton_read_A || write_waiton_write_A) &&
(A2B_len != BUF_SIZE) &&
/*
* a. A is readable.
* b. the read was blocked for "WANT_WRITE" and A
* is writable now.
*/
(can_read_A || (can_write_A && read_waiton_write_A)))
{
read_waiton_read_A = 0;
read_waiton_write_A = 0;
code = SSL_read(A, A2B + A2B_len, BUF_SIZE - A2B_len);
switch (SSL_get_error(A, code))
{
...
case SSL_ERROR_WANT_READ:
read_waiton_read_A = 1;
break;
case SSL_ERROR_WANT_WRITE:
read_waiton_write_A = 1;
break;
...
}
}
...
/* not in the middle of a read on A */
if (!(read_waiton_write_A || read_waiton_read_A) &&
have_data_B2A &&
/*
* a. A is writable.
* b. the write was blocked for "WANT_READ" and A
* is readable now.
*/
(can_write_A || (can_read_A && write_waiton_read_A)))
{
write_waiton_read_A = 0;
write_waiton_write_A = 0;
code = SSL_write(A, B2A, B2A_len);
switch (SSL_get_error(A, code))
{
...
case SSL_ERROR_WANT_READ:
write_waiton_read_A = 1;
break;
case SSL_ERROR_WANT_WRITE:
write_waiton_write_A = 1;
...
}
}
...
}
ich aus dem Code schließen, dass über die ich für SSL_read warten muss() abgeschlossen werden, wenn es für SSL_ERROR_WANT_READ blockiert ist, kann ich nicht nennen SSL_write(), obwohl ein beschreibbarer auf diesen Zustand ist.
Ist es richtig? Ich möchte, dass mein Programm Daten gleichzeitig lesen und senden kann, kann ich SSL_write() aufrufen, wenn SSL_read() für SSL_ERROR_WANT_READ blockiert ist?
Jede Hilfe wird sehr geschätzt. Vielen Dank im Voraus.
Ich weiß, dass SSL_read() wird wieder SSL_WANT_READ erhalten, wenn es für SSL_ERROR_WANT_READ blockiert wurde. Wie wäre es mit SSL_write() wenn SSL_read() blockiert wurde? Die Verbindung meines Programms ist sehr langlebig, und ich möchte Daten in die SSL-Instanz schreiben, obwohl sie in SSL_read() blockiert wurde, so dass der Durchsatz nicht abnimmt. – Choes