Несколько разъемов - PullRequest
5 голосов
/ 06 июня 2010

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

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

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

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

Ответы [ 2 ]

5 голосов
/ 06 июня 2010

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

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

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

4 голосов
/ 07 июня 2010

Прочитайте страницу C10K для получения целого ряда вариантов. Затем прочитайте статью High Performance Server Architecture . Они ответят на множество вопросов для вас.

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

...