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
каждый раз ради проверки.