From fd6fddb61aec4f231d669e3f3bfc391da2ad75b8 Mon Sep 17 00:00:00 2001 From: Ted John Date: Mon, 17 Aug 2020 17:44:53 +0100 Subject: [PATCH] Improve WSA handling --- src/openrct2/network/NetworkBase.cpp | 7 --- src/openrct2/network/Socket.cpp | 84 +++++++++++++++++----------- src/openrct2/network/Socket.h | 2 - 3 files changed, 52 insertions(+), 41 deletions(-) diff --git a/src/openrct2/network/NetworkBase.cpp b/src/openrct2/network/NetworkBase.cpp index 18e8a477ac..d52209c464 100644 --- a/src/openrct2/network/NetworkBase.cpp +++ b/src/openrct2/network/NetworkBase.cpp @@ -148,11 +148,6 @@ void NetworkBase::SetEnvironment(const std::shared_ptr& en bool NetworkBase::Init() { - if (!InitialiseWSA()) - { - return false; - } - status = NETWORK_STATUS_READY; ServerName = std::string(); @@ -240,8 +235,6 @@ void NetworkBase::CloseConnection() mode = NETWORK_MODE_NONE; status = NETWORK_STATUS_NONE; _lastConnectStatus = SOCKET_STATUS_CLOSED; - - DisposeWSA(); } bool NetworkBase::BeginClient(const std::string& host, uint16_t port) diff --git a/src/openrct2/network/Socket.cpp b/src/openrct2/network/Socket.cpp index cbbcfdf96c..2cf213ab2c 100644 --- a/src/openrct2/network/Socket.cpp +++ b/src/openrct2/network/Socket.cpp @@ -70,8 +70,56 @@ constexpr auto CONNECT_TIMEOUT = std::chrono::milliseconds(3000); +// RAII WSA initialisation needed for Windows # ifdef _WIN32 -static bool _wsaInitialised = false; +class WSA +{ +private: + bool _isInitialised{}; + +public: + bool IsInitialised() const + { + return _isInitialised; + } + + bool Initialise() + { + if (!_isInitialised) + { + log_verbose("WSAStartup()"); + WSADATA wsa_data; + if (WSAStartup(MAKEWORD(2, 2), &wsa_data) != 0) + { + log_error("Unable to initialise winsock."); + return false; + } + _isInitialised = true; + } + return true; + } + + ~WSA() + { + if (_isInitialised) + { + log_verbose("WSACleanup()"); + WSACleanup(); + _isInitialised = false; + } + } +}; + +static bool InitialiseWSA() +{ + static WSA wsa; + return wsa.Initialise(); +} +# else +static bool InitialiseWSA() +{ + return true; +} # endif class SocketException : public std::runtime_error @@ -830,37 +878,6 @@ private: } }; -bool InitialiseWSA() -{ -# ifdef _WIN32 - if (!_wsaInitialised) - { - log_verbose("Initialising WSA"); - WSADATA wsa_data; - if (WSAStartup(MAKEWORD(2, 2), &wsa_data) != 0) - { - log_error("Unable to initialise winsock."); - return false; - } - _wsaInitialised = true; - } - return _wsaInitialised; -# else - return true; -# endif -} - -void DisposeWSA() -{ -# ifdef _WIN32 - if (_wsaInitialised) - { - WSACleanup(); - _wsaInitialised = false; - } -# endif -} - std::unique_ptr CreateTcpSocket() { InitialiseWSA(); @@ -869,12 +886,15 @@ std::unique_ptr CreateTcpSocket() std::unique_ptr CreateUdpSocket() { + InitialiseWSA(); return std::make_unique(); } # ifdef _WIN32 static std::vector GetNetworkInterfaces() { + InitialiseWSA(); + int sock = socket(AF_INET, SOCK_DGRAM, 0); if (sock == -1) { diff --git a/src/openrct2/network/Socket.h b/src/openrct2/network/Socket.h index 5d9b9a89ad..87ba24ee65 100644 --- a/src/openrct2/network/Socket.h +++ b/src/openrct2/network/Socket.h @@ -97,8 +97,6 @@ public: virtual void Close() abstract; }; -bool InitialiseWSA(); -void DisposeWSA(); std::unique_ptr CreateTcpSocket(); std::unique_ptr CreateUdpSocket(); std::vector> GetBroadcastAddresses();