Суть задачи следующая, это одноранговое соединение, по сути существует рой и мне надо подключиться ко всем его участникам. При этом мой порт (который я задам) станет храниться в этом рое вместе с ip адресом, когда я сделаю запрос на получение списка участников из этого роя (я стану таким же участником роя). Но проблема в том, что я не понимаю как можно занять порт еще до подключения, завязать каждый сокет к этим участникам через этот порт, ну и одновременно создать acceptor под этот порт.
Пояснение:
Примерно так я делаю подключение (тут порт (который я хочу связать
со своей стороны) не указывается и мне непонятно какой он будет?) :
void client::do_connect(ba::ip::tcp::resolver::iterator endpoint) {
auto self(Get());
ba::async_connect(socket_, std::move(endpoint), [this, self](boost::system::error_code ec, [[maybe_unused]] const ba::ip::tcp::resolver::iterator&) {
if (!ec) {
... // полезная работа если подключились
} else try_again();
});
timeout_.expires_from_now(connection_waiting_time + epsilon);
}
После того как я буду подключен, уже ко мне будут обращаться новые участники по тому порту который я указал (когда оформлял запрос в этот рой) и тут понятно на какой порт соединяется сокет.
tcp::endpoint endpoint(tcp::v4(), "2007");
tcp::acceptor acceptor_(io_service, endpoint);
// ...
void Listener::do_accept() {
acceptor_.async_accept(socket_,
[this](boost::system::error_code ec){
if (!ec) {
... // делаем новое соединение с сокетом
}
do_accept();
});
}
Но как я могу сделать так, чтобы всей программой во всех сокетах использовался один и тот же порт? Или в случае с подключением это не имеет никакого значения?