我一次又一次地调用我的函数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 ;
答案 0 :(得分:0)
在轮询中,当我第一次调用函数时,我只在向量中分配套接字fds一次,然后我再次调用该函数来检查套接字上的任何事件。
这可以解释为什么这两个代码路径的行为不同。为了检查,每次都要使您的轮询代码重建ufds
。