Сокеты в Unix

  • Автор темы alexdrob
  • Дата начала
Статус
Закрыто для дальнейших ответов.
A

alexdrob

Гость
#1
Как я понял из статей, чтобы сокет сделать не блокируемым, нужно вызвать функцию
C++:
fcntl(sd, F_SETFL, O_NONBLOCK);
и для каждого подключенного клиента тоже.

Вот назрел вопрос, а как сделать ожидание клиентов в основном потоке, а опрос подключившихся в дополнительном. Идея примерно такая

основной поток
C++:
std::set<ClientSocket*> clients;
clients.clear();
while(1)
{
fd_set readset;
FD_ZERO(&readset);
FD_SET(sd, &readset);

timeval timeout;
timeout.tv_sec = 15;
timeout.tv_usec = 0;

if(select(sd+1, &readset, NULL, NULL, &timeout) <= 0)
{
perror("Erorr socket select");
exit(1);
}

if(FD_ISSET(sd, &readset))
{
ClientSocket* sock = new ClientSocket(sd);

if(sock->getSock() < 0)
{
perror("Erorr socket accept");
exit(1);
}

fcntl(sock->getSock(), F_SETFL, O_NONBLOCK);

printf ("New client connected\n");

clients.insert(sock);
}
}
Но проходит таймаут и программа завершается.

Можно ли сделать основной сокети, который ждёт подключения клиентов блокируемым, а подключившихся клиентов н*цензура*кируемыми, что то типа
C++:
while(1)
{
sock = accept(listener, NULL, NULL);
fcntl(sock->getSock(), F_SETFL, O_NONBLOCK);
clients.insert(sock);
}
Как бы основной поток будет виснуть на accept пока не появится новый клиент, а если появится сокет новый станет асинхронным. А основной останется синхронный. Или как сделать правильней?
 
Статус
Закрыто для дальнейших ответов.