diff --git a/include/libp2p/transport/quic/transport.hpp b/include/libp2p/transport/quic/transport.hpp index 23575dd..1c79396 100644 --- a/include/libp2p/transport/quic/transport.hpp +++ b/include/libp2p/transport/quic/transport.hpp @@ -49,7 +49,7 @@ namespace libp2p::transport { bool canDial(const Multiaddress &ma) const override; private: - std::shared_ptr makeClient( + outcome::result> makeClient( boost::asio::ip::udp protocol) const; std::shared_ptr io_context_; diff --git a/src/transport/quic/transport.cpp b/src/transport/quic/transport.cpp index babab91..0369706 100644 --- a/src/transport/quic/transport.cpp +++ b/src/transport/quic/transport.cpp @@ -25,9 +25,7 @@ namespace libp2p::transport { mux_config_{mux_config}, local_peer_{id_mgr.getId()}, key_codec_{std::move(key_codec)}, - resolver_{*io_context_}, - client4_{makeClient(boost::asio::ip::udp::v4())}, - client6_{makeClient(boost::asio::ip::udp::v6())} {} + resolver_{*io_context_} {} CoroOutcome> QuicTransport::dial(const PeerId &peer, Multiaddress address) { @@ -50,6 +48,9 @@ namespace libp2p::transport { auto remote = results.begin()->endpoint(); auto v4 = remote.protocol() == boost::asio::ip::udp::v4(); auto &client = v4 ? client4_ : client6_; + if (client == nullptr) { + BOOST_OUTCOME_CO_TRY(client, makeClient(remote.protocol())); + } auto conn_result = co_await client->connect(remote, peer); if (!conn_result) { co_return conn_result.as_failure(); @@ -67,17 +68,20 @@ namespace libp2p::transport { return detail::asQuic(ma).has_value(); } - std::shared_ptr QuicTransport::makeClient( + outcome::result> QuicTransport::makeClient( boost::asio::ip::udp protocol) const { + boost::asio::ip::udp::socket socket{*io_context_}; + boost::system::error_code ec; + socket.open(protocol, ec); + if (ec) { + return ec; + } return std::make_shared(io_context_, ssl_context_, mux_config_, local_peer_, key_codec_, - boost::asio::ip::udp::socket{ - *io_context_, - protocol, - }, + std::move(socket), true); } } // namespace libp2p::transport