Я работал над сложной системой сервер-клиент в C, и я не уверен, как реализовать связь через сокет.
В двух словах, система представляет собой серверное приложение, которое взаимодействует сбазы данных и использует сокет UNIX для связи с одним или несколькими дочерними процессами, созданными с помощью fork()
.Целью детей является запуск игровых серверов.Процесс запуска игрового сервера выглядит следующим образом:
- Сервер / «менеджер» определяет игровой сервер в базе данных, которую необходимо создать.(Предположим, связь с базой данных уже отсортирована.)
- Менеджер разветвляет дочерний элемент («игровой контроллер»).
- Игровой контроллер устанавливает две пары каналов, затем разветвляется, заменяя стандартный дочерний элемент.с каналом, и это stdout и stderr с другим каналом.
- Затем дочерний элемент игрового контроллера запускает
execlp()
, чтобы запустить текущий исполняемый файл игрового сервера.
Мой опыт работы с сокетамидовольно минимально.Ранее я использовал select()
в серверном приложении для «мультиплексирования» многочисленных клиентов, что демонстрирует простой пример, приведенный в документации GNU C здесь .
Теперь у меня есть новая задача,поскольку система должна иметь возможность делать больше: менеджер должен иметь возможность произвольно отправлять команды дочерним элементам игрового контроллера (которые он будет обнаруживать путем периодической проверки базы данных) и получать ответы, но также ожидают входящиепроизвольные команды / ошибки от них и отправка ответов назад.
Итак, мне нужна своего рода «контекстная» система, где сокеты имеют смысл только между собой.Другими словами, когда команда отправляется от менеджера к игровому контроллеру, каждая сторона должна знать, кто спрашивает, и знать, что является ответом (и, следовательно, на какую команду это ответ).
Поскольку select()
полезен только для того, чтобы знать, когда у нас есть входящие данные, и поток должен блокировать их, нужен ли мне другой поток, который отправляет данные и получает ответы?Для этого потребуется, чтобы каждый игровой контроллер, хотя технически был «клиентом», использовал гнездо для прослушивания и также использовал select()
?
Надеюсь, я кратко объяснил систему и проблему;Я добавлю больше деталей, если требуется.Спасибо!