как управлять несколькими экземплярами приложения на сервере, подключающегося к нескольким клиентам на разных компьютерах - PullRequest
1 голос
/ 18 мая 2011

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

Каждая пара сервер-клиент должна иметь два tcp-соединения.Серверное приложение имеет 2 процесса, и каждый процесс имеет свое собственное tcp-соединение с клиентом.

  • Процесс A обменивается командами с клиентом
  • Процесс B получает постоянный видеопоток от клиента.

Кроме того, между каждой парой имеется другое tcp-соединение.Процесс A / Процесс B

Команды / Данные будут поступать следующим образом:

Клиент <-> Процесс A <---> Процесс B

во время передачи видеов этом направлении:

client -> Process B

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

В настоящее время у меня есть один экземпляр Процесса A, взаимодействующий как с Процессом B, так и с клиентом, но он все работает на одной машине, поэтому сейчас я просто использую «localhost» в качестве имени хоста.Я также жестко кодирую 2 порта, которые я использую, поэтому мне нужно также изменить это, когда у меня есть несколько экземпляров, чтобы каждый экземпляр использовал разные порты.

Как только Процесс A устанавливает соединение с Клиентом, ему нужнозапросить у клиента порт, чтобы процесс B мог установить другое соединение напрямую с клиентом.Это хороший способ сделать это, или как лучше?Как клиент может определить, какой порт доступен для использования?

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

Спасибо, пожалуйстазадавайте любые вопросы обо всем, что не ясно.

РЕДАКТИРОВАТЬ: На самом деле процесс A и процесс B являются двумя различными приложениями.

1 Ответ

0 голосов
/ 18 мая 2011

Я не знаю достаточно о приложении, поэтому возможно, что это можно еще больше упростить, но я бы сделал следующее:

  • Создайте один или два серверных процесса, прослушивающих известные порты (возможно, вы могли бы сократить это до одного, но если вам понадобится два, хорошо, я объясню, как это сделать).

  • Если вы можете передать его на один серверный процесс, он может прослушивать оба порта сам. Используя вызов select, вы можете отслеживать активность каждого дескриптора открытого файла. Фактически, именно поэтому я думаю, что вы могли бы сделать все это с помощью одного процесса или небольшого пула.

  • Пусть клиент подключится к известному порту на сервере. Подключение сервера к клиенту доставит вам неприятности, когда вы попадете в удаленные сети. Вы всегда можете получить сервер где-нибудь с переадресацией портов или в DMZ, но вы не можете настаивать на том, чтобы все ваши клиенты изменили свою сеть для удаления NAT, отключения брандмауэров или переадресации портов для вашего приложения.

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

  • Если вам нужен отдельный процесс, используйте fork для разделения процессов. В дочернем процессе вы закрываете файловые дескрипторы, которые прослушивают известные порты. И в родительском процессе вы закрываете файловые дескрипторы, которые подключены к клиентам, в дополнение к файловым дескрипторам, которые подключены к другому серверному процессу.

Примечание. Это фон Linux, но я уверен, что все эти функции и методы будут работать в Windows. Я уверен, что кто-то исправит меня, если я ошибаюсь. Я настоятельно рекомендую попытаться использовать select, чтобы свести это к одному процессу, который значительно облегчит ваше кодирование. Если вам нужно более эффективно использовать многопроцессорную систему, переходите к многопоточности или используйте пул процессов, компромиссных для обработки соединений. Изучение того, как файловые дескрипторы работают после fork, упростит кодирование, если вам потребуется создать несколько процессов.

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