mirror of
https://github.com/OpenRCT2/OpenRCT2
synced 2025-12-24 00:03:11 +01:00
@@ -234,7 +234,7 @@ void NetworkBase::CloseConnection()
|
|||||||
|
|
||||||
mode = NETWORK_MODE_NONE;
|
mode = NETWORK_MODE_NONE;
|
||||||
status = NETWORK_STATUS_NONE;
|
status = NETWORK_STATUS_NONE;
|
||||||
_lastConnectStatus = SOCKET_STATUS_CLOSED;
|
_lastConnectStatus = SocketStatus::Closed;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool NetworkBase::BeginClient(const std::string& host, uint16_t port)
|
bool NetworkBase::BeginClient(const std::string& host, uint16_t port)
|
||||||
@@ -260,7 +260,7 @@ bool NetworkBase::BeginClient(const std::string& host, uint16_t port)
|
|||||||
_serverState.gamestateSnapshotsEnabled = false;
|
_serverState.gamestateSnapshotsEnabled = false;
|
||||||
|
|
||||||
status = NETWORK_STATUS_CONNECTING;
|
status = NETWORK_STATUS_CONNECTING;
|
||||||
_lastConnectStatus = SOCKET_STATUS_CLOSED;
|
_lastConnectStatus = SocketStatus::Closed;
|
||||||
_clientMapLoaded = false;
|
_clientMapLoaded = false;
|
||||||
_serverTickData.clear();
|
_serverTickData.clear();
|
||||||
|
|
||||||
@@ -543,11 +543,11 @@ void NetworkBase::UpdateClient()
|
|||||||
{
|
{
|
||||||
switch (_serverConnection->Socket->GetStatus())
|
switch (_serverConnection->Socket->GetStatus())
|
||||||
{
|
{
|
||||||
case SOCKET_STATUS_RESOLVING:
|
case SocketStatus::Resolving:
|
||||||
{
|
{
|
||||||
if (_lastConnectStatus != SOCKET_STATUS_RESOLVING)
|
if (_lastConnectStatus != SocketStatus::Resolving)
|
||||||
{
|
{
|
||||||
_lastConnectStatus = SOCKET_STATUS_RESOLVING;
|
_lastConnectStatus = SocketStatus::Resolving;
|
||||||
char str_resolving[256];
|
char str_resolving[256];
|
||||||
format_string(str_resolving, 256, STR_MULTIPLAYER_RESOLVING, nullptr);
|
format_string(str_resolving, 256, STR_MULTIPLAYER_RESOLVING, nullptr);
|
||||||
|
|
||||||
@@ -558,11 +558,11 @@ void NetworkBase::UpdateClient()
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SOCKET_STATUS_CONNECTING:
|
case SocketStatus::Connecting:
|
||||||
{
|
{
|
||||||
if (_lastConnectStatus != SOCKET_STATUS_CONNECTING)
|
if (_lastConnectStatus != SocketStatus::Connecting)
|
||||||
{
|
{
|
||||||
_lastConnectStatus = SOCKET_STATUS_CONNECTING;
|
_lastConnectStatus = SocketStatus::Connecting;
|
||||||
char str_connecting[256];
|
char str_connecting[256];
|
||||||
format_string(str_connecting, 256, STR_MULTIPLAYER_CONNECTING, nullptr);
|
format_string(str_connecting, 256, STR_MULTIPLAYER_CONNECTING, nullptr);
|
||||||
|
|
||||||
@@ -575,7 +575,7 @@ void NetworkBase::UpdateClient()
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SOCKET_STATUS_CONNECTED:
|
case SocketStatus::Connected:
|
||||||
{
|
{
|
||||||
status = NETWORK_STATUS_CONNECTED;
|
status = NETWORK_STATUS_CONNECTED;
|
||||||
_serverConnection->ResetLastPacketTime();
|
_serverConnection->ResetLastPacketTime();
|
||||||
|
|||||||
@@ -228,7 +228,7 @@ private: // Client Data
|
|||||||
int32_t status = NETWORK_STATUS_NONE;
|
int32_t status = NETWORK_STATUS_NONE;
|
||||||
uint8_t player_id = 0;
|
uint8_t player_id = 0;
|
||||||
uint16_t _port = 0;
|
uint16_t _port = 0;
|
||||||
SOCKET_STATUS _lastConnectStatus = SOCKET_STATUS_CLOSED;
|
SocketStatus _lastConnectStatus = SocketStatus::Closed;
|
||||||
bool _requireReconnect = false;
|
bool _requireReconnect = false;
|
||||||
bool _clientMapLoaded = false;
|
bool _clientMapLoaded = false;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -103,7 +103,7 @@ private:
|
|||||||
auto ticks = Platform::GetTicks();
|
auto ticks = Platform::GetTicks();
|
||||||
if (ticks > _lastListenTime + 500)
|
if (ticks > _lastListenTime + 500)
|
||||||
{
|
{
|
||||||
if (_lanListener->GetStatus() != SOCKET_STATUS_LISTENING)
|
if (_lanListener->GetStatus() != SocketStatus::Listening)
|
||||||
{
|
{
|
||||||
_lanListener->Listen(NETWORK_LAN_BROADCAST_PORT);
|
_lanListener->Listen(NETWORK_LAN_BROADCAST_PORT);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -250,7 +250,7 @@ private:
|
|||||||
class TcpSocket final : public ITcpSocket, protected Socket
|
class TcpSocket final : public ITcpSocket, protected Socket
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
std::atomic<SOCKET_STATUS> _status = ATOMIC_VAR_INIT(SOCKET_STATUS_CLOSED);
|
std::atomic<SocketStatus> _status = ATOMIC_VAR_INIT(SocketStatus::Closed);
|
||||||
uint16_t _listeningPort = 0;
|
uint16_t _listeningPort = 0;
|
||||||
SOCKET _socket = INVALID_SOCKET;
|
SOCKET _socket = INVALID_SOCKET;
|
||||||
|
|
||||||
@@ -271,7 +271,7 @@ public:
|
|||||||
CloseSocket();
|
CloseSocket();
|
||||||
}
|
}
|
||||||
|
|
||||||
SOCKET_STATUS GetStatus() const override
|
SocketStatus GetStatus() const override
|
||||||
{
|
{
|
||||||
return _status;
|
return _status;
|
||||||
}
|
}
|
||||||
@@ -296,7 +296,7 @@ public:
|
|||||||
|
|
||||||
void Listen(const std::string& address, uint16_t port) override
|
void Listen(const std::string& address, uint16_t port) override
|
||||||
{
|
{
|
||||||
if (_status != SOCKET_STATUS_CLOSED)
|
if (_status != SocketStatus::Closed)
|
||||||
{
|
{
|
||||||
throw std::runtime_error("Socket not closed.");
|
throw std::runtime_error("Socket not closed.");
|
||||||
}
|
}
|
||||||
@@ -352,12 +352,12 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
_listeningPort = port;
|
_listeningPort = port;
|
||||||
_status = SOCKET_STATUS_LISTENING;
|
_status = SocketStatus::Listening;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<ITcpSocket> Accept() override
|
std::unique_ptr<ITcpSocket> Accept() override
|
||||||
{
|
{
|
||||||
if (_status != SOCKET_STATUS_LISTENING)
|
if (_status != SocketStatus::Listening)
|
||||||
{
|
{
|
||||||
throw std::runtime_error("Socket not listening.");
|
throw std::runtime_error("Socket not listening.");
|
||||||
}
|
}
|
||||||
@@ -407,7 +407,7 @@ public:
|
|||||||
|
|
||||||
void Connect(const std::string& address, uint16_t port) override
|
void Connect(const std::string& address, uint16_t port) override
|
||||||
{
|
{
|
||||||
if (_status != SOCKET_STATUS_CLOSED && _status != SOCKET_STATUS_WAITING)
|
if (_status != SocketStatus::Closed && _status != SocketStatus::Waiting)
|
||||||
{
|
{
|
||||||
throw std::runtime_error("Socket not closed.");
|
throw std::runtime_error("Socket not closed.");
|
||||||
}
|
}
|
||||||
@@ -415,7 +415,7 @@ public:
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
// Resolve address
|
// Resolve address
|
||||||
_status = SOCKET_STATUS_RESOLVING;
|
_status = SocketStatus::Resolving;
|
||||||
|
|
||||||
sockaddr_storage ss{};
|
sockaddr_storage ss{};
|
||||||
socklen_t ss_len;
|
socklen_t ss_len;
|
||||||
@@ -424,7 +424,7 @@ public:
|
|||||||
throw SocketException("Unable to resolve address.");
|
throw SocketException("Unable to resolve address.");
|
||||||
}
|
}
|
||||||
|
|
||||||
_status = SOCKET_STATUS_CONNECTING;
|
_status = SocketStatus::Connecting;
|
||||||
_socket = socket(ss.ss_family, SOCK_STREAM, IPPROTO_TCP);
|
_socket = socket(ss.ss_family, SOCK_STREAM, IPPROTO_TCP);
|
||||||
if (_socket == INVALID_SOCKET)
|
if (_socket == INVALID_SOCKET)
|
||||||
{
|
{
|
||||||
@@ -481,7 +481,7 @@ public:
|
|||||||
}
|
}
|
||||||
if (error == 0)
|
if (error == 0)
|
||||||
{
|
{
|
||||||
_status = SOCKET_STATUS_CONNECTED;
|
_status = SocketStatus::Connected;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -499,7 +499,7 @@ public:
|
|||||||
|
|
||||||
void ConnectAsync(const std::string& address, uint16_t port) override
|
void ConnectAsync(const std::string& address, uint16_t port) override
|
||||||
{
|
{
|
||||||
if (_status != SOCKET_STATUS_CLOSED)
|
if (_status != SocketStatus::Closed)
|
||||||
{
|
{
|
||||||
throw std::runtime_error("Socket not closed.");
|
throw std::runtime_error("Socket not closed.");
|
||||||
}
|
}
|
||||||
@@ -507,7 +507,7 @@ public:
|
|||||||
// When connect is called, the status is set to resolving, but we want to make sure
|
// When connect is called, the status is set to resolving, but we want to make sure
|
||||||
// the status is changed before this async method exits. Otherwise, the consumer
|
// the status is changed before this async method exits. Otherwise, the consumer
|
||||||
// might think the status has closed before it started to connect.
|
// might think the status has closed before it started to connect.
|
||||||
_status = SOCKET_STATUS_WAITING;
|
_status = SocketStatus::Waiting;
|
||||||
|
|
||||||
auto saddress = std::string(address);
|
auto saddress = std::string(address);
|
||||||
std::promise<void> barrier;
|
std::promise<void> barrier;
|
||||||
@@ -530,7 +530,7 @@ public:
|
|||||||
|
|
||||||
void Finish() override
|
void Finish() override
|
||||||
{
|
{
|
||||||
if (_status == SOCKET_STATUS_CONNECTED)
|
if (_status == SocketStatus::Connected)
|
||||||
{
|
{
|
||||||
shutdown(_socket, SHUT_WR);
|
shutdown(_socket, SHUT_WR);
|
||||||
}
|
}
|
||||||
@@ -538,7 +538,7 @@ public:
|
|||||||
|
|
||||||
void Disconnect() override
|
void Disconnect() override
|
||||||
{
|
{
|
||||||
if (_status == SOCKET_STATUS_CONNECTED)
|
if (_status == SocketStatus::Connected)
|
||||||
{
|
{
|
||||||
shutdown(_socket, SHUT_RDWR);
|
shutdown(_socket, SHUT_RDWR);
|
||||||
}
|
}
|
||||||
@@ -546,7 +546,7 @@ public:
|
|||||||
|
|
||||||
size_t SendData(const void* buffer, size_t size) override
|
size_t SendData(const void* buffer, size_t size) override
|
||||||
{
|
{
|
||||||
if (_status != SOCKET_STATUS_CONNECTED)
|
if (_status != SocketStatus::Connected)
|
||||||
{
|
{
|
||||||
throw std::runtime_error("Socket not connected.");
|
throw std::runtime_error("Socket not connected.");
|
||||||
}
|
}
|
||||||
@@ -568,7 +568,7 @@ public:
|
|||||||
|
|
||||||
NetworkReadPacket ReceiveData(void* buffer, size_t size, size_t* sizeReceived) override
|
NetworkReadPacket ReceiveData(void* buffer, size_t size, size_t* sizeReceived) override
|
||||||
{
|
{
|
||||||
if (_status != SOCKET_STATUS_CONNECTED)
|
if (_status != SocketStatus::Connected)
|
||||||
{
|
{
|
||||||
throw std::runtime_error("Socket not connected.");
|
throw std::runtime_error("Socket not connected.");
|
||||||
}
|
}
|
||||||
@@ -635,7 +635,7 @@ private:
|
|||||||
_socket = socket;
|
_socket = socket;
|
||||||
_hostName = hostName;
|
_hostName = hostName;
|
||||||
_ipAddress = ipAddress;
|
_ipAddress = ipAddress;
|
||||||
_status = SOCKET_STATUS_CONNECTED;
|
_status = SocketStatus::Connected;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CloseSocket()
|
void CloseSocket()
|
||||||
@@ -645,7 +645,7 @@ private:
|
|||||||
closesocket(_socket);
|
closesocket(_socket);
|
||||||
_socket = INVALID_SOCKET;
|
_socket = INVALID_SOCKET;
|
||||||
}
|
}
|
||||||
_status = SOCKET_STATUS_CLOSED;
|
_status = SocketStatus::Closed;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string GetIpAddressFromSocket(const sockaddr_in* addr)
|
std::string GetIpAddressFromSocket(const sockaddr_in* addr)
|
||||||
@@ -678,7 +678,7 @@ private:
|
|||||||
class UdpSocket final : public IUdpSocket, protected Socket
|
class UdpSocket final : public IUdpSocket, protected Socket
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
SOCKET_STATUS _status = SOCKET_STATUS_CLOSED;
|
SocketStatus _status = SocketStatus::Closed;
|
||||||
uint16_t _listeningPort = 0;
|
uint16_t _listeningPort = 0;
|
||||||
SOCKET _socket = INVALID_SOCKET;
|
SOCKET _socket = INVALID_SOCKET;
|
||||||
NetworkEndpoint _endpoint;
|
NetworkEndpoint _endpoint;
|
||||||
@@ -694,7 +694,7 @@ public:
|
|||||||
CloseSocket();
|
CloseSocket();
|
||||||
}
|
}
|
||||||
|
|
||||||
SOCKET_STATUS GetStatus() const override
|
SocketStatus GetStatus() const override
|
||||||
{
|
{
|
||||||
return _status;
|
return _status;
|
||||||
}
|
}
|
||||||
@@ -711,7 +711,7 @@ public:
|
|||||||
|
|
||||||
void Listen(const std::string& address, uint16_t port) override
|
void Listen(const std::string& address, uint16_t port) override
|
||||||
{
|
{
|
||||||
if (_status != SOCKET_STATUS_CLOSED)
|
if (_status != SocketStatus::Closed)
|
||||||
{
|
{
|
||||||
throw std::runtime_error("Socket not closed.");
|
throw std::runtime_error("Socket not closed.");
|
||||||
}
|
}
|
||||||
@@ -740,7 +740,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
_listeningPort = port;
|
_listeningPort = port;
|
||||||
_status = SOCKET_STATUS_LISTENING;
|
_status = SocketStatus::Listening;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t SendData(const std::string& address, uint16_t port, const void* buffer, size_t size) override
|
size_t SendData(const std::string& address, uint16_t port, const void* buffer, size_t size) override
|
||||||
@@ -770,7 +770,7 @@ public:
|
|||||||
auto ss = &dest->GetAddress();
|
auto ss = &dest->GetAddress();
|
||||||
auto ss_len = dest->GetAddressLen();
|
auto ss_len = dest->GetAddressLen();
|
||||||
|
|
||||||
if (_status != SOCKET_STATUS_LISTENING)
|
if (_status != SocketStatus::Listening)
|
||||||
{
|
{
|
||||||
_endpoint = *dest;
|
_endpoint = *dest;
|
||||||
}
|
}
|
||||||
@@ -797,7 +797,7 @@ public:
|
|||||||
{
|
{
|
||||||
sockaddr_in senderAddr{};
|
sockaddr_in senderAddr{};
|
||||||
socklen_t senderAddrLen = sizeof(sockaddr_in);
|
socklen_t senderAddrLen = sizeof(sockaddr_in);
|
||||||
if (_status != SOCKET_STATUS_LISTENING)
|
if (_status != SocketStatus::Listening)
|
||||||
{
|
{
|
||||||
senderAddrLen = _endpoint.GetAddressLen();
|
senderAddrLen = _endpoint.GetAddressLen();
|
||||||
std::memcpy(&senderAddr, &_endpoint.GetAddress(), senderAddrLen);
|
std::memcpy(&senderAddr, &_endpoint.GetAddress(), senderAddrLen);
|
||||||
@@ -836,7 +836,7 @@ private:
|
|||||||
{
|
{
|
||||||
_socket = socket;
|
_socket = socket;
|
||||||
_hostName = hostName;
|
_hostName = hostName;
|
||||||
_status = SOCKET_STATUS_CONNECTED;
|
_status = SocketStatus::Connected;
|
||||||
}
|
}
|
||||||
|
|
||||||
SOCKET CreateSocket()
|
SOCKET CreateSocket()
|
||||||
@@ -879,7 +879,7 @@ private:
|
|||||||
closesocket(_socket);
|
closesocket(_socket);
|
||||||
_socket = INVALID_SOCKET;
|
_socket = INVALID_SOCKET;
|
||||||
}
|
}
|
||||||
_status = SOCKET_STATUS_CLOSED;
|
_status = SocketStatus::Closed;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -15,14 +15,14 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
enum SOCKET_STATUS
|
enum class SocketStatus
|
||||||
{
|
{
|
||||||
SOCKET_STATUS_CLOSED,
|
Closed,
|
||||||
SOCKET_STATUS_WAITING,
|
Waiting,
|
||||||
SOCKET_STATUS_RESOLVING,
|
Resolving,
|
||||||
SOCKET_STATUS_CONNECTING,
|
Connecting,
|
||||||
SOCKET_STATUS_CONNECTED,
|
Connected,
|
||||||
SOCKET_STATUS_LISTENING,
|
Listening,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class NetworkReadPacket : int32_t
|
enum class NetworkReadPacket : int32_t
|
||||||
@@ -53,7 +53,7 @@ struct ITcpSocket
|
|||||||
public:
|
public:
|
||||||
virtual ~ITcpSocket() = default;
|
virtual ~ITcpSocket() = default;
|
||||||
|
|
||||||
virtual SOCKET_STATUS GetStatus() const abstract;
|
virtual SocketStatus GetStatus() const abstract;
|
||||||
virtual const char* GetError() const abstract;
|
virtual const char* GetError() const abstract;
|
||||||
virtual const char* GetHostName() const abstract;
|
virtual const char* GetHostName() const abstract;
|
||||||
virtual std::string GetIpAddress() const abstract;
|
virtual std::string GetIpAddress() const abstract;
|
||||||
@@ -83,7 +83,7 @@ struct IUdpSocket
|
|||||||
public:
|
public:
|
||||||
virtual ~IUdpSocket() = default;
|
virtual ~IUdpSocket() = default;
|
||||||
|
|
||||||
virtual SOCKET_STATUS GetStatus() const abstract;
|
virtual SocketStatus GetStatus() const abstract;
|
||||||
virtual const char* GetError() const abstract;
|
virtual const char* GetError() const abstract;
|
||||||
virtual const char* GetHostName() const abstract;
|
virtual const char* GetHostName() const abstract;
|
||||||
|
|
||||||
|
|||||||
@@ -302,14 +302,14 @@ namespace OpenRCT2::Scripting
|
|||||||
auto status = _socket->GetStatus();
|
auto status = _socket->GetStatus();
|
||||||
if (_connecting)
|
if (_connecting)
|
||||||
{
|
{
|
||||||
if (status == SOCKET_STATUS_CONNECTED)
|
if (status == SocketStatus::Connected)
|
||||||
{
|
{
|
||||||
_connecting = false;
|
_connecting = false;
|
||||||
_wasConnected = true;
|
_wasConnected = true;
|
||||||
_eventList.Raise(EVENT_CONNECT_ONCE, GetPlugin(), {}, false);
|
_eventList.Raise(EVENT_CONNECT_ONCE, GetPlugin(), {}, false);
|
||||||
_eventList.RemoveAllListeners(EVENT_CONNECT_ONCE);
|
_eventList.RemoveAllListeners(EVENT_CONNECT_ONCE);
|
||||||
}
|
}
|
||||||
else if (status == SOCKET_STATUS_CLOSED)
|
else if (status == SocketStatus::Closed)
|
||||||
{
|
{
|
||||||
_connecting = false;
|
_connecting = false;
|
||||||
|
|
||||||
@@ -324,7 +324,7 @@ namespace OpenRCT2::Scripting
|
|||||||
_eventList.Raise(EVENT_ERROR, GetPlugin(), { dukErr }, true);
|
_eventList.Raise(EVENT_ERROR, GetPlugin(), { dukErr }, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (status == SOCKET_STATUS_CONNECTED)
|
else if (status == SocketStatus::Connected)
|
||||||
{
|
{
|
||||||
char buffer[2048];
|
char buffer[2048];
|
||||||
size_t bytesRead{};
|
size_t bytesRead{};
|
||||||
@@ -388,7 +388,7 @@ namespace OpenRCT2::Scripting
|
|||||||
{
|
{
|
||||||
if (_socket != nullptr)
|
if (_socket != nullptr)
|
||||||
{
|
{
|
||||||
return _socket->GetStatus() == SOCKET_STATUS_LISTENING;
|
return _socket->GetStatus() == SocketStatus::Listening;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -413,7 +413,7 @@ namespace OpenRCT2::Scripting
|
|||||||
_socket = CreateTcpSocket();
|
_socket = CreateTcpSocket();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_socket->GetStatus() == SOCKET_STATUS_LISTENING)
|
if (_socket->GetStatus() == SocketStatus::Listening)
|
||||||
{
|
{
|
||||||
duk_error(ctx, DUK_ERR_ERROR, "Server is already listening.");
|
duk_error(ctx, DUK_ERR_ERROR, "Server is already listening.");
|
||||||
}
|
}
|
||||||
@@ -488,7 +488,7 @@ namespace OpenRCT2::Scripting
|
|||||||
if (_socket == nullptr)
|
if (_socket == nullptr)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (_socket->GetStatus() == SOCKET_STATUS_LISTENING)
|
if (_socket->GetStatus() == SocketStatus::Listening)
|
||||||
{
|
{
|
||||||
auto client = _socket->Accept();
|
auto client = _socket->Accept();
|
||||||
if (client != nullptr)
|
if (client != nullptr)
|
||||||
|
|||||||
Reference in New Issue
Block a user