LINUX.ORG.RU

OpenSSL. SSL_read - ограничить время ожидания

 


0

1

Мой сервер использует синхронные сокеты. Я бы хотел чтобы клиенты, долго не проявляющие активность, отсоединялись. Мне бы для этого подошла возможность установить время ожидания приёма данных - SSL_read. Есть ли возможность так сделать?


У самого OpenSSL — нет. Для определения отпавшего клиента следует взять файловый дескриптор сокета и делать на него какой-нибудь poll() или select() перед вызовом SSL_read(). Отпал по таймауту — значит и клиент отпал.

ilammy ★★★
()

Я буду очень благодарен за работающий пример.

Как не застрять в SSL_read, а сделать, чтобы через заданный промежуток времени код пошёл выполняться дальше. В идеале, чтобы соединение не разрывалось, а просто выполнение кода перешло на следующую строку.

user08
() автор топика
Ответ на: комментарий от ossa

SO_RCVTIMEO установить.

timeval interval;
interval.tv_sec = 180;
interval.tv_usec = 0;
setsockopt(sd, SOL_SOCKET, SO_RCVTIMEO, (const char *)&interval, sizeof(timeval));

Такой код у меня приводит к тому, что работает только первый SSL_read, потом он возвращает -1.

user08
() автор топика
Последнее исправление: user08 (всего исправлений: 1)
Ответ на: комментарий от user08

потом он возвращает -1.

Ошибка-то какая при этом?

anonymous
()

Нашёл такое решение

bool wait(int fd, long seconds)
{
    if (fd < 0) {
        return false;
    }

    fd_set fdSet;
    FD_ZERO(&fdSet);
    FD_SET(fd, &fdSet);

    timeval tv = { seconds, 0 };
    int rc = select(fd + 1, &fdSet, NULL, NULL, &tv);

    return (rc != 0);
}
user08
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.