Socket Select() работает, но Poll() работает неправильно

Я снова и снова вызываю свою функцию eventOnSocket(), чтобы проверить, есть ли какое-либо событие в сокетах.

Мой код работает нормально. Если я использую select, но если я использую poll, то мой код работает неправильно. В случае опроса я получаю ошибку тайм-аута.

Вот это рабочий код с выбором.

int eventOnSocket() 
{
    int retVal = -1;
    int socketMax = -1;
    struct timeval tv;
    tv.tv_sec = 15; //sec
    tv.tv_usec = 0; //microsec
    FD_ZERO(&m_rfds);

    for(int i = 0; i < m_sockList.size(); i++) 
    {
        int socketId = task->m_sockList.at(i);
        if(socketMax < socketId)
            socketMax = socketId;
        FD_SET(socketId, m_rfds);
    }
    if(socketMax > 0) {
        retVal = select(socketMax+1, &m_rfds, NULL, NULL, &tv);
        return retVal;
    }
    else
        return -1;
}

Но когда я использую опрос тем же способом, я получаю ошибку тайм-аута. В опросе я назначаю сокету fds только один раз в векторе, когда я вызываю функцию первый раз, а затем вызываю функцию снова и снова, чтобы проверить любое событие в сокетах.

Вот код с опросом.

int eventOnSocket()
{
    /* Assign socket fds only once in a vector when function is called first time only*/
    if(true == assignSocktOnlyOnce)
    {       
        assignSocktOnlyOnce = false;

        for(int i=0; i < m_sockList.size(); i++) 
        {
            INT32_N socketId = m_sockList.at(i);
            struct pollfd pfd;
            pfd.fd = socketId;
            pfd.events = POLLIN;

            ufds.push_back(pfd);
        }
    }
    retVal = poll(&ufds[0],(nfds_t)ufds.size(), 15000);
    if (retVal == -1) {
            LOG_ERR("===  error in  Polling === "); 
    }
    else if (retVal == 0) {
            LOG_ERR("Timeout occurred!  No data after 15 seconds.");
    }
    else {
            for(int i = 0; i < ufds.size(); i++) {
                if (ufds[i].revents & POLLIN )
                        LOG_ERR("Read for socket fd:%d",ufds[i].fd);
            }
    }
    return retVal;
}

ufds is vector defined in .h file
std::vector<struct pollfd> ufds ;

1 ответ

В опросе я назначаю сокет fds только один раз в векторе, когда вызываю функцию первый раз, а затем вызываю функцию снова и снова, чтобы проверить любое событие в сокетах.

Это может объяснить, почему эти два пути кода ведут себя по-разному. Перестройте код опроса ufds каждый раз ради проверки.

Другие вопросы по тегам