Несколько сокетных соединений

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

Так как мне нужно подтверждение, что клиенты получили информацию, и не хотят создавать структуру ACK для соединения UDP, я решил использовать метод потоковой передачи TCP. Однако я изо всех сил пытался понять, как поддержать многочисленные связи и сохранить их неактивными.

У меня, кажется, есть три опции. Используйте ветвление для каждого входящего соединения, чтобы создать отдельный дочерний процесс, использовать pthread_create для создания всего нового потока для каждого процесса или выбора использования () для ожидания на всех открытых идентификаторах сокета соединения.

Рекомендации относительно того, как напасть на это? Я начал работать с pthreads, но так как производительность, вероятно, не будет проблемой, многоядерная обработка не необходима и возможно существует более простой путь.

5
задан BSchlinker 6 June 2010 в 06:18
поделиться

2 ответа

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

Можно использовать потоки, но у вас будут другие проблемы, если ваши потоки будут продолжать блокироваться при получении через сокет.

select () (или poll () в более новых (POSIX) Unix) по-прежнему остается лучшим решением. Вы указываете либо select (), либо poll (), какие сокеты или дескрипторы вы хотите отслеживать для событий (вероятно, вам достаточно просто событий ввода (чтения)), затем вы выполняете только чтение для этого сокета или дескриптора, который был отмечен выбором ()/опрос(). Гарантируется, что recv () не заблокируется.

5
ответ дан 14 December 2019 в 01:02
поделиться

Прочтите страницу C10K , чтобы узнать о множестве опций. Затем прочтите статью Архитектура высокопроизводительного сервера . Это ответит вам на множество вопросов.

Я бы выбрал третий вариант. Для этого загляните в epoll (4) и / или kqueue (2) средства для замены современных исполнителей select / poll .

4
ответ дан 14 December 2019 в 01:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: