Уведомить поток, когда ввод / вывод возможен на сокете - PullRequest
1 голос
/ 03 апреля 2019

Я создаю многопользовательский игровой сервер. В настоящее время сетевая архитектура довольно проста: поток-акцептор представляет собой бесконечный цикл, который просто ожидает в функции accept (). Если он получает соединение, он все настраивает и порождает поток для обработки связи с этим клиентом.

Моя проблема возникает после того, как я получу пакет входа в систему, потому что поток должен просто подождать, пока появятся какие-либо данные для чтения (приходит новый пакет, такой как «атака на это существо»). Я знаю, что флаг O_ASYNC заставит систему запустить SIGIO, но поскольку потоки имеют одинаковый PID в linux, сигнал отлавливается всем процессом.

Существует ли эффективный способ уведомления потока, когда есть данные для чтения, чтобы он знал, когда нужно проанализировать пакет и в конечном итоге вызвать рабочий поток для обработки команды?

Редактировать: забыл упомянуть, что я установил сокет в O_NONBLOCK, поэтому read () не блокирует, потому что поток клиента может быть вызван в любой момент другим потоком.

Ответы [ 2 ]

1 голос
/ 03 апреля 2019

Если вы работаете в Linux.Я рекомендую вам просто оставить тему и начать использовать epoll.Epoll может взять несколько файловых дескрипторов и просмотреть их все.

Вы можете начать здесь: https://kovyrin.net/2006/04/13/epoll-asynchronous-network-programming/ Или здесь: http://man7.org/linux/man-pages/man7/epoll.7.html

1 голос
/ 03 апреля 2019

Используйте select() или epoll() (в Linux) или kqueue (в BSD).

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