У меня есть основная программа, которая запускает 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
Но, как упоминалось ранее, у меня есть гонки. Так что время от времени я все еще сталкиваюсь с ошибками.
Кто-нибудь есть идеи, как я могу улучшить это?
Многие из вас упомянули, что мой дочерний процесс найдет доступные порты и уведомит мою основную программу. Хотя это хороший способ, но в моем случае это действительно трудно достичь.
Есть ли способ зарезервировать порт, чтобы позволить охлажденному процессу использовать, не закрывая его?
Ответ, основанный на том, что я понимаю из вашего описания, а именно: вы запускаете программу A, которая запускает 4 других процесса, которые обмениваются данными с A через порт 1004, вы хотели бы иметь возможность запустить другой A до завершения первого A. Правильно ?
Подсказки: