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 件のコメント:
コメントを投稿