2016-06-20 3 views
0

Моя программа была разработана на основе OpenSSL (режим блокировки), я бы хотел реорганизовать ее на неблокирующую. Он вызывает SSL_read() в потоке с объектом SSL и вызывает SSL_write() в другом потоке с тем же объектом.Можно ли вызвать SSL_write(), если SSL_read() заблокирован для SSL_ERROR_WANT_READ?

Я изучил незаблокированный режим OpenSSL из книги "Network Security with OpenSSL", для этого режима есть пример (data_transfer).

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; 
      ... 
     } 
    } 

    ... 
} 

Я делаю вывод из приведенного выше, что я должен ждать SSL_read() будет завершена, если он заблокирован для SSL_ERROR_WANT_READ кода, я не могу назвать SSL_write(), хотя А запись на этом условии.

Правильно ли это? Я хотел бы, чтобы моя программа могла читать и отправлять данные одновременно, могу ли я вызвать SSL_write(), если SSL_read() заблокирован для SSL_ERROR_WANT_READ?

Любая помощь очень ценится. Большое спасибо заранее.

ответ

0

Вы можете попробовать, но все, что вы получите, это SSL_WANT_READ.

Трудно понять, почему вы даже созерцаете это.

+0

Я знаю, что SSL_read() снова получит SSL_WANT_READ, если он был заблокирован для SSL_ERROR_WANT_READ. Как насчет SSL_write(), если SSL_read() заблокирован? Соединение моей программы является долговечным, и я хотел бы записать данные в экземпляр SSL, хотя он был заблокирован в SSL_read(), поэтому пропускная способность не будет уменьшаться. – Choes