Посмотрел и вот что сделал:
void TDaemon::MainLoop()
{
char buffer[256];
int ret_code;
timeval tv;
fd_set rfds;
while(true)
{
if(!sock->Listen() && (clientSID = sock->Accept(0, 0)))
{
puts("\nNew Connection\n");
while(true)
{
FD_ZERO(&rfds);
FD_SET(clientSID, &rfds);
tv.tv_sec = timeout;
tv.tv_usec = 0;
int ret = select(clientSID + 1, &rfds, NULL, NULL, &tv);
if(!ret && FD_ISSET(clientSID, &rfds))
break;
puts("\nNew Cycle\n");
while(sock->Read(buffer, 255, 0, clientSID) > 0)
printf("\nServer: %s\n", buffer);
}
}
}
}
Насколько я понял select либо дождется данных либо вывалится по timeout.
Если она дожидается данных, то начинает работать цикл с Read. После того как данные кончаются, по логике нужно заново вызывать select и ждать еще данных. Но у меня, после того как я считал все данные (Read возвращает 0), select, при следующей итерации, сразу говорит, что данные есть, хотя Read ничего не считывает (реально нет данных) и программа входит в бесконечный цикл. Правильно ли ведет себя select?
Read, Listen, Accept - непосредственно вызывают функции recv, listen, accept соответственно (это inline методы класса содержащие только вызовы описанных функций).