2021年2月9日火曜日

opensslプログラミング:受信データの待ち方/poll()の使い方

 poll() -> SSL_read() の順番で呼び出すと、データが読み込めない場合がある。

これは SSL_read() した際に socket buffer -> SSL read buffer へデータが移動しており、且つSSL_read() で全てのデータを読みきれなかった状態で、poll() に突入することになる。

相手側が既に全てのデータを送信し終り、こちらからのレスポンス待ち状態だったとすると、こちら側も poll() でデータ受信待ち状態になってしまう。

なので、SSL_read() を使う場合は、下記のよう先に受信処理を行う必要がある。

その場合、予め socket を Non-Blocking mode にしておかないと SSL_read()/recv() でブロックされるので注意。

            loop = true;

do {

               if (tls_enable == true) {

        if ((r = SSL_read(ssl, buf, sizeof buf)) <= 0) {

                       if (r == 0 || SSL_get_error(ssl, r) != SSL_ERROR_WANT_READ) {

                break;    // error

                       }

        }

              else {

                  if ((r = recv(fd, buf, sizeof buf)) <= 0) {

                      if (r == 0 || (errno != EAGAIN && errno != EWOULDBLOCK)) {

                         break;  // error

                      }

              }

              switch (poll()) {

              case -1:  perror(); loop = false; break; // error

              case 0: loop = false; break; // error

              default:  // event happened

                 break;

              }

} while (loop);


0 件のコメント:

コメントを投稿