Как мне принять любое количество соединений, используя `accept ()` в течение определенного периода времени?

Например, я не знаю, сколько клиентов будет подключаться, но я бы хотел, чтобы любое количество клиентов могло подключаться в течение определенного периода времени, например, 10 секунд.

Прямо сейчас у меня есть что-то вроде этого:

unsigned int currentTime = (unsigned int)time(NULL);
int session[100], sessionCount = 0;

// accept connections for 10 seconds:
while ( (unsigned int)time(NULL) - currentTime < 10 ) {
session[sessionCount++] = accept( my_sock_desc, (struct sockaddr *)&client_sock_addr, &sock_size );
}

Это будет принимать любое количество соединений, но очевидно, что последняя итерация цикла while оставит вызов accept (), блокирующий продолжение программы.

Как бы я решил эту проблему?

0

Решение

проверьте код сервера Вот

псевдокод:

listener thread:
while(1)
{
:
:
if(select(...)>0)
{
if(FD_SET(..))
if(accept(...)) dispatch_msg_to_processing_thread;
}
:
:
}

processing thread: process message.
1

Другие решения

Вы хотите использовать Выбрать или же опрос со значением тайм-аута, чтобы определить, безопасно ли принимать вызов без блокировки.

void mainloop()
{
time_t startTime = time(NULL);
time_t listenTime = 10; // 10 seconds, for example
time_t elapsed = 0;

elapsed = time(NULL) - startTime;
secondsToWait = (elapsed >= listenTime) ? 0 : (listenTime-elapsed);
while (secondsToWait > 0)
{
fd_set readset = {};
FD_SET(my_sock_desc, &readset);
timeval waittime = {};
waittime.tv_sec = secondsToWait;
int count = select(my_sock_desc+1, &readset, NULL, NULL, &waittime);
if (FD_ISSET(my_sock_desc, &readset))
{
accept( my_sock_desc, (struct sockaddr *)&client_sock_addr, &sock_size );
}

elapsed = time(NULL) - startTime;
secondsToWait = (elapsed >= listenTime) ? 0 : (listenTime-elapsed);
}
}
2