добавить / удалить дескрипторы сокетов из poll () - PullRequest
0 голосов
/ 03 апреля 2012

У меня есть приложение на сервере TCP, в котором при получении входящего соединения я принимаю соединение и добавляю дескриптор сокета в список.Серверу нужен список, чтобы он мог перебирать список и периодически отправлять данные всем подключенным клиентам.

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

Я попытался добавить дескрипторы в poll (), чтобы я мог обнаружить любое закрытое соединениес может быть POLLHUP, но я не могу понять, как прервать опрос, чтобы динамически добавлять дескрипторы к его набору при каждом входящем новом соединении.

Серверу просто нужен список дескрипторов всех открытых соединений всякий раз, когда он хочетдля отправки данных.

Как мне поступить?Любые предложения?

РЕДАКТИРОВАТЬ: Вот что я сделал: я создал поток для каждого клиента и добавил его fd в опрос.Псевдокод на сервере:

sockfd = accept the conn.
pthread_create

// Inside the thread, add sockfd to poll
struct pollfd fds[1];
fds[0].fd = sockfd;
poll(fds, 1, 500000);
Check for POLLHUP returned event and see which client(fd) closed the connection.

Кажется, это опрашивает все дескрипторы, но моя проблема сейчас заключается в том, что когда я тестировал закрытие соединений с двумя клиентами ... только один из дескрипторов возвращает POLLHUP.

1 Ответ

3 голосов
/ 03 апреля 2012

Я не могу понять, как прервать опрос, чтобы динамически добавлять дескрипторы к его набору при каждом входящем новом соединении

Вы должны следить за сокетом прослушивания на предмет активности.Как только poll разблокирует, первое, что вы проверяете, это «стало ли мое прослушивающее гнездо интересным?».Если это так, примите и добавьте к poll и свой собственный список.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...