У меня уже был мой класс сокетов, но я хотел добавить таймаут, используя select(). Кажется довольно прямолинейным, но у меня всегда есть 0, возвращаемый функцией select(). Я даже удалил check(), чтобы он считывал данные независимо от select(), и данные считываются, но select() все еще сообщает, что данных нет. Любая подсказка о том, как получить select(), чтобы перестать лгать мне? Я также установил, что сокет не блокируется. Благодарю.check on socket with select() возвращает 0, когда данные присутствуют
Код:
char buf [ MAXRECV + 1 ];
s = "";
memset (buf, 0, MAXRECV + 1);
struct timeval tv;
int retval;
fd_set Sockets;
FD_ZERO(&Sockets);
FD_SET(m_sock,&Sockets);
// Print sock int for sainity
std::cout << "\nm_sock:" << m_sock << "\n";
tv.tv_sec = 1;
tv.tv_usec = 0;
retval = select(1, &Sockets, NULL, NULL, &tv);
std::cout << "\nretval is :[" << retval << "]\n\n";
// Check
if (FD_ISSET(m_sock,&Sockets))
std::cout << "\nFD_ISSET(m_sock,&Sockets) is true\n\n";
else
std::cout << "\nFD_ISSET(m_sock,&Sockets) is false\n\n";
// If error occurs
if (retval == -1)
{
perror("select()");
std::cout << "\nERROR IN SELECT()\n";
}
// If data present
else if (retval)
{
std::cout << "\nDATA IS READY TO BE READ\n";
std::cout << "recv (m_sock, buf, MAXRECV, 0)... m_sock is " << m_sock << "\n";
int status = recv (m_sock, buf, MAXRECV, 0);
if (status == -1)
{
std::cout << "status == -1 errno == " << errno << " in Socket::recv\n";
return 0;
}
else if (status == 0)
{
return 0;
}
else
{
s = buf;
return status;
}
}
// If data not present
else
{
std::cout << "\nDATA WAS NOT READY, TIMEOUT\n";
return 0;
}
Да, я полностью согласен, намного лучше. Моя настройка прямо сейчас имеет дело с двумя сокетами, одной синхронизацией и одной асинхронной. Но я вызывающе собираюсь переписать, чтобы реализовать ваш подход. – Matt