套接字Select()正在运行,但Poll()无法正常工作

时间:2014-05-30 07:19:09

标签: linux sockets unix-socket

我一次又一次地调用我的函数eventOnSocket()以检查套接字上是否有任何事件。

我的代码工作正常如果我使用select但是如果我使用poll,那么我的代码无法正常工作。如果是民意调查,我收到超时错误。

这是使用select的工作代码。

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;
}

但是当我以相同的方式使用Poll时,我会收到超时错误。在轮询中,当我第一次调用函数时,我只在向量中分配套接字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 个答案:

答案 0 :(得分:0)

  

在轮询中,当我第一次调用函数时,我只在向量中分配套接字fds一次,然后我再次调用该函数来检查套接字上的任何事件。

这可以解释为什么这两个代码路径的行为不同。为了检查,每次都要使您的轮询代码重建ufds