Poll() указывает, что сокет имеет данные, но recv() блокирует ожидание навсегда

Я использую функцию socket_has_data() ниже, чтобы уведомить, есть ли у (блокирующего) сокета данные. Если да, то я вызываю recv() из того же потока. Я делаю это так, потому что пока не могу перейти на неблокирующий сокет.

Я столкнулся с ошибкой, при которой socket_has_data() возвращает true, но recv() блокируется, не возвращая никаких данных.

Должно ли это быть возможным/правильно ли я использую poll()?

bool socket_has_data()
{
    const size_t timeout_ms = 0;
    const size_t num_fds = 1;

    const int ret = ::poll(_fds, num_fds, timeout_ms);

    if(ret > 0)
    {
        if (_fds[0].revents & POLLIN)
        {
            return true;
        }
    }

    return false;
}

void configure_socket()
{
    _fds[0].fd = this->_sockfd;   // socket descriptor from socket()
    _fds[0].events = POLLIN;
}

struct pollfd _fds[1];
Станимир
Вопрос задан30 июня 2024 г.

1 Ответ

Ваш ответ

Загрузить файл.