Как сделать динамическую диспетчеризацию портов TCP в распределенном моделировании

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

Для этого используется фиксированный порт, например, «1004».

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

Поэтому я обновил основную программу, которая проверяет между «1004-10010» и отправляет порт. Код похож на:

find available ports
close the ports (I see I must close the ports so that child process can run)
start sub process given the ports

code:
boost::asio::ip::tcp::endpoint ep(tcp::v4(), port_number);
boost::system::error_code ec;

_acceptor.open( ep.protocol());
_acceptor.bind( ep, ec);

if (ec)
{
port_number++; ec.clear(); _acceptor.close();
} else
{
_acceptor.listen();
port_number = _acceptor.local_endpoint(ec).port();
port_found = true;
}

...............
_acceptor.close();
---races here-----
start child process

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

Кто-нибудь есть идеи, как я могу улучшить это?

  1. Многие из вас упомянули, что мой дочерний процесс найдет доступные порты и уведомит мою основную программу. Хотя это хороший способ, но в моем случае это действительно трудно достичь.

  2. Есть ли способ зарезервировать порт, чтобы позволить охлажденному процессу использовать, не закрывая его?

0

Решение

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

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

Подсказки:

  1. При создании в сокете, если вы зададите 0 в качестве номера порта, вы получите доступный номер порта. Вы можете указать этот номер порта в командной строке дочернего процесса. Таким образом, у вас есть выделенная розетка для общения с детьми.
  2. Чтобы определить, является ли это другой экземпляр вашей программы, вы можете сделать вывод, что не удалось создать сокет на выделенном порту (в вашем случае 1004).
0

Другие решения


По вопросам рекламы [email protected]