Несколько серверов TCP / IP и общий доступ к одному и тому же “хорошо известному порту” ... каким-то образом?

StackOverflow https://stackoverflow.com/questions/1864451

Вопрос

Я приношу извинения за странную формулировку вопроса...вот в чем проблема дизайна:

Я разрабатываю сервер (в Linux с использованием C ++, FWIW), который предоставляет сервис для многих экземпляров клиентского приложения, запущенного на потребительских ПК.

Я хочу следующее:

1) Все клиенты сначала идентифицируют себя с серверным приложением "gatekeeper".Считайте это процедурой входа в систему, при которой передаются учетные данные, такие как имя пользователя и пароль.Вызовите программу gatekeeper "gserver".(для привратника.)

2) После того, как каждый клиент прошел проверку, он затем устанавливается в долгосрочное соединение с одним из нескольких экземпляров другого серверного приложения, запущенного на том же физическом сервере, привязанном к тому же адресу сервера.Вызовите любой из этих экземпляров "wserver" (для "рабочего" сервера).)

Итак, клиент видит, что приложение "gatekeeper" предоставляет ему доступ с паролем к одному из нескольких "рабочих" серверов, работающих на одном и том же сервере.

Вот "настоящая" задача:мы хотим использовать исключительно "хорошо известный" номер порта для входящих подключений к серверу (например, порт 80 или 443, скажем.) Или наш собственный "хорошо известный" порт.

Мы бы предпочли не заставлять клиента подключаться ко второму порту на сервере на этапе долгосрочного соединения с wserver (n).Проблема с этим, конечно, заключается в том, что только один серверный процесс одновременно может быть привязан к одному и тому же порту и адресу сервера.

Это подразумевает, что соединение, установленное клиентом с gserver, также должно выполнять роль долгосрочного соединения.Единственный способ, который я вижу для достижения этого, заключается в том, что gserver должен после входа в систему действовать как прокси-сервер и копировать трафик между собой и клиентом на конкретный wserver (n), к которому клиент привязан логически.

Было бы идеально, если бы соединение TCP / IP, впервые установленное между клиентом (n) и gserver, могло быть каким-то образом "перенесено" в другое приложение на том же сервере в целости и сохранности, а затем могло поддерживаться одним из экземпляров wserver (n) для долгосрочного соединения.

Я знаю, что веб-серверы делают что-то подобное для распределения нагрузки на сервер."Балансировка нагрузки".Основное отличие здесь заключается в том, что "балансировка" - это выделение конкретного пользователя конкретному экземпляру wserver (n).Но у меня также сложилось впечатление, что балансировка нагрузки - это своего рода проксирование, которого я пытаюсь избежать (поскольку это усложняет архитектуру и увеличивает накладные расходы, а также единственную точку отказа).

Это концептуальный и дизайнерский вопрос.Не беспокойтесь о примерах исходного кода, если только они не являются абсолютно необходимыми для донесения идей.Если мы определим подход, я смогу его закодировать.

Спасибо!

Это было полезно?

Решение

То, что вы ищете, это передача файлового дескриптора.См. УНП 15.7.Одним из хорошо известных активных пользователей этого объекта является постфикс.

Другие советы

Я разработал такое приложение давным-давно.Поскольку несколько серверов не могут прослушивать один и тот же порт.Что вам нужно, так это чтобы gserver прослушивал хорошо известный порт.Как только соединение установлено, передайте его другим серверам через сокет Unix.Как только соединение передается на другой сервер, gserver выходит из поля зрения.Он может умереть, а другой сервер все еще будет обслуживать соединение.

Я не знаю, применимо ли это к вашему дизайну, но обычным решением (реализуемым демоном xinetd) является fork(), а затем exec() процесс.Например, xinetd может обслуживать такие сервисы, как rlogin, rsh, tftp, telnet и т.д.которые на самом деле обслуживаются разными Программы.Это не будет вам полезно, если ваши wservers - это процессы, уже запущенные в системе.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top