diff --git a/examples/BUILD.gn b/examples/BUILD.gn index 55a94fe007..458205cea7 100644 --- a/examples/BUILD.gn +++ b/examples/BUILD.gn @@ -686,6 +686,7 @@ if (is_linux || is_chromeos || is_win) { ] deps = [ + "../api:async_dns_resolver", "../api:audio_options_api", "../api:create_peerconnection_factory", "../api:libjingle_peerconnection_api", @@ -703,6 +704,7 @@ if (is_linux || is_chromeos || is_win) { "../media:rtc_media_base", "../p2p:rtc_p2p", "../pc:video_track_source", + "../rtc_base:async_dns_resolver", "../rtc_base:checks", "../rtc_base:logging", "../rtc_base:macromagic", diff --git a/examples/peerconnection/client/peer_connection_client.cc b/examples/peerconnection/client/peer_connection_client.cc index 2746752d80..48d5bb6545 100644 --- a/examples/peerconnection/client/peer_connection_client.cc +++ b/examples/peerconnection/client/peer_connection_client.cc @@ -12,6 +12,7 @@ #include "api/units/time_delta.h" #include "examples/peerconnection/client/defaults.h" +#include "rtc_base/async_dns_resolver.h" #include "rtc_base/checks.h" #include "rtc_base/logging.h" #include "rtc_base/net_helpers.h" @@ -32,7 +33,7 @@ rtc::Socket* CreateClientSocket(int family) { } // namespace PeerConnectionClient::PeerConnectionClient() - : callback_(NULL), resolver_(NULL), state_(NOT_CONNECTED), my_id_(-1) {} + : callback_(NULL), resolver_(nullptr), state_(NOT_CONNECTED), my_id_(-1) {} PeerConnectionClient::~PeerConnectionClient() = default; @@ -95,26 +96,32 @@ void PeerConnectionClient::Connect(const std::string& server, client_name_ = client_name; if (server_address_.IsUnresolvedIP()) { + RTC_DCHECK_NE(state_, RESOLVING); + RTC_DCHECK(!resolver_); state_ = RESOLVING; - resolver_ = new rtc::AsyncResolver(); - resolver_->SignalDone.connect(this, &PeerConnectionClient::OnResolveResult); - resolver_->Start(server_address_); + resolver_ = std::make_unique(); + resolver_->Start(server_address_, + [this] { OnResolveResult(resolver_->result()); }); } else { DoConnect(); } } void PeerConnectionClient::OnResolveResult( - rtc::AsyncResolverInterface* resolver) { - if (resolver_->GetError() != 0) { + const webrtc::AsyncDnsResolverResult& result) { + if (result.GetError() != 0) { callback_->OnServerConnectionFailure(); - resolver_->Destroy(false); - resolver_ = NULL; + resolver_.reset(); state_ = NOT_CONNECTED; - } else { - server_address_ = resolver_->address(); - DoConnect(); + return; } + if (!result.GetResolvedAddress(AF_INET, &server_address_)) { + callback_->OnServerConnectionFailure(); + resolver_.reset(); + state_ = NOT_CONNECTED; + return; + } + DoConnect(); } void PeerConnectionClient::DoConnect() { @@ -196,10 +203,7 @@ void PeerConnectionClient::Close() { hanging_get_->Close(); onconnect_data_.clear(); peers_.clear(); - if (resolver_ != NULL) { - resolver_->Destroy(false); - resolver_ = NULL; - } + resolver_.reset(); my_id_ = -1; state_ = NOT_CONNECTED; } diff --git a/examples/peerconnection/client/peer_connection_client.h b/examples/peerconnection/client/peer_connection_client.h index 8f9c5b6a75..d56752a7fa 100644 --- a/examples/peerconnection/client/peer_connection_client.h +++ b/examples/peerconnection/client/peer_connection_client.h @@ -15,6 +15,7 @@ #include #include +#include "api/async_dns_resolver.h" #include "api/task_queue/pending_task_safety_flag.h" #include "rtc_base/net_helpers.h" #include "rtc_base/physical_socket_server.h" @@ -109,11 +110,11 @@ class PeerConnectionClient : public sigslot::has_slots<> { void OnClose(rtc::Socket* socket, int err); - void OnResolveResult(rtc::AsyncResolverInterface* resolver); + void OnResolveResult(const webrtc::AsyncDnsResolverResult& result); PeerConnectionClientObserver* callback_; rtc::SocketAddress server_address_; - rtc::AsyncResolver* resolver_; + std::unique_ptr resolver_; std::unique_ptr control_socket_; std::unique_ptr hanging_get_; std::string onconnect_data_; diff --git a/p2p/base/basic_async_resolver_factory.cc b/p2p/base/basic_async_resolver_factory.cc index 67c81670d2..5a8c7a27a7 100644 --- a/p2p/base/basic_async_resolver_factory.cc +++ b/p2p/base/basic_async_resolver_factory.cc @@ -22,9 +22,12 @@ namespace webrtc { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" rtc::AsyncResolverInterface* BasicAsyncResolverFactory::Create() { return new rtc::AsyncResolver(); } +#pragma clang diagnostic pop std::unique_ptr BasicAsyncDnsResolverFactory::Create() { diff --git a/p2p/base/basic_packet_socket_factory.cc b/p2p/base/basic_packet_socket_factory.cc index 5bc02dd0f0..b07a407164 100644 --- a/p2p/base/basic_packet_socket_factory.cc +++ b/p2p/base/basic_packet_socket_factory.cc @@ -184,11 +184,14 @@ AsyncResolverInterface* BasicPacketSocketFactory::CreateAsyncResolver() { return new AsyncResolver(); } +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" std::unique_ptr BasicPacketSocketFactory::CreateAsyncDnsResolver() { return std::make_unique( new AsyncResolver()); } +#pragma clang diagnostic pop int BasicPacketSocketFactory::BindSocket(Socket* socket, const SocketAddress& local_address, diff --git a/rtc_base/BUILD.gn b/rtc_base/BUILD.gn index 419128d89d..83f728a809 100644 --- a/rtc_base/BUILD.gn +++ b/rtc_base/BUILD.gn @@ -1046,6 +1046,7 @@ rtc_library("threading") { "//third_party/abseil-cpp/absl/strings", ] deps = [ + ":async_dns_resolver", ":async_resolver_interface", ":byte_order", ":checks", @@ -1061,9 +1062,11 @@ rtc_library("threading") { ":refcount", ":rtc_event", ":rtc_task_queue", + ":socket", ":socket_address", ":socket_server", ":timeutils", + "../api:async_dns_resolver", "../api:function_view", "../api:location", "../api:refcountedbase", diff --git a/rtc_base/physical_socket_server.cc b/rtc_base/physical_socket_server.cc index d42168249a..b0af1c20ce 100644 --- a/rtc_base/physical_socket_server.cc +++ b/rtc_base/physical_socket_server.cc @@ -10,6 +10,7 @@ #include "rtc_base/physical_socket_server.h" #include +#include #if defined(_MSC_VER) && _MSC_VER < 1300 #pragma warning(disable : 4786) @@ -21,7 +22,6 @@ #if defined(WEBRTC_POSIX) #include -#include #if defined(WEBRTC_USE_EPOLL) // "poll" will be used to wait for the signal dispatcher. #include @@ -30,7 +30,6 @@ #endif #include #include -#include #include #endif @@ -38,20 +37,18 @@ #include #include #include + #undef SetPort #endif #include -#include -#include - -#include "rtc_base/arraysize.h" -#include "rtc_base/byte_order.h" +#include "rtc_base/async_dns_resolver.h" #include "rtc_base/checks.h" +#include "rtc_base/event.h" +#include "rtc_base/ip_address.h" #include "rtc_base/logging.h" #include "rtc_base/network_monitor.h" -#include "rtc_base/null_socket_server.h" #include "rtc_base/synchronization/mutex.h" #include "rtc_base/time_utils.h" #include "system_wrappers/include/field_trial.h" @@ -70,6 +67,7 @@ #if defined(WEBRTC_POSIX) #include // for TCP_NODELAY + #define IP_MTU 14 // Until this is integrated from linux/in.h to netinet/in.h typedef void* SockOptArg; @@ -252,9 +250,8 @@ int PhysicalSocket::Connect(const SocketAddress& addr) { } if (addr.IsUnresolvedIP()) { RTC_LOG(LS_VERBOSE) << "Resolving addr in PhysicalSocket::Connect"; - resolver_ = new AsyncResolver(); - resolver_->SignalDone.connect(this, &PhysicalSocket::OnResolveResult); - resolver_->Start(addr); + resolver_ = std::make_unique(); + resolver_->Start(addr, [this] { OnResolveResult(resolver_->result()); }); state_ = CS_CONNECTING; return 0; } @@ -564,8 +561,7 @@ int PhysicalSocket::Close() { state_ = CS_CLOSED; SetEnabledEvents(0); if (resolver_) { - resolver_->Destroy(false); - resolver_ = nullptr; + resolver_.reset(); } return err; } @@ -589,14 +585,16 @@ int PhysicalSocket::DoSendTo(SOCKET socket, return ::sendto(socket, buf, len, flags, dest_addr, addrlen); } -void PhysicalSocket::OnResolveResult(AsyncResolverInterface* resolver) { - if (resolver != resolver_) { - return; - } - - int error = resolver_->GetError(); +void PhysicalSocket::OnResolveResult( + const webrtc::AsyncDnsResolverResult& result) { + int error = result.GetError(); if (error == 0) { - error = DoConnect(resolver_->address()); + SocketAddress address; + if (result.GetResolvedAddress(AF_INET, &address)) { + error = DoConnect(address); + } else { + Close(); + } } else { Close(); } diff --git a/rtc_base/physical_socket_server.h b/rtc_base/physical_socket_server.h index 650db80931..ea449ff121 100644 --- a/rtc_base/physical_socket_server.h +++ b/rtc_base/physical_socket_server.h @@ -11,17 +11,23 @@ #ifndef RTC_BASE_PHYSICAL_SOCKET_SERVER_H_ #define RTC_BASE_PHYSICAL_SOCKET_SERVER_H_ +#include "api/async_dns_resolver.h" #include "api/units/time_delta.h" +#include "rtc_base/socket.h" +#include "rtc_base/socket_address.h" +#include "rtc_base/third_party/sigslot/sigslot.h" #if defined(WEBRTC_POSIX) #if defined(WEBRTC_LINUX) // On Linux, use epoll. #include + #define WEBRTC_USE_EPOLL 1 #elif defined(WEBRTC_FUCHSIA) // Fuchsia implements select and poll but not epoll, and testing shows that poll // is faster than select. #include + #define WEBRTC_USE_POLL 1 #else // On other POSIX systems, use select by default. @@ -29,7 +35,9 @@ #endif // WEBRTC_POSIX #include +#include #include +#include #include #include @@ -218,7 +226,7 @@ class PhysicalSocket : public Socket, public sigslot::has_slots<> { SocketAddress* out_addr, int64_t* timestamp); - void OnResolveResult(AsyncResolverInterface* resolver); + void OnResolveResult(const webrtc::AsyncDnsResolverResult& resolver); void UpdateLastError(); void MaybeRemapSendError(); @@ -237,7 +245,7 @@ class PhysicalSocket : public Socket, public sigslot::has_slots<> { mutable webrtc::Mutex mutex_; int error_ RTC_GUARDED_BY(mutex_); ConnState state_; - AsyncResolver* resolver_; + std::unique_ptr resolver_; #if !defined(NDEBUG) std::string dbg_addr_;