From bb83d527d205ddd39126ddcf80908e45bbdba643 Mon Sep 17 00:00:00 2001 From: staphen Date: Sun, 17 Sep 2023 10:36:53 -0400 Subject: [PATCH] Change server_exception from dvlnet_exception to PacketError --- Source/dvlnet/tcp_client.cpp | 3 --- Source/dvlnet/tcp_server.cpp | 43 ++++++++++++++++++------------------ Source/dvlnet/tcp_server.h | 8 +++---- 3 files changed, 25 insertions(+), 29 deletions(-) diff --git a/Source/dvlnet/tcp_client.cpp b/Source/dvlnet/tcp_client.cpp index 627e1ad78..5bf460e59 100644 --- a/Source/dvlnet/tcp_client.cpp +++ b/Source/dvlnet/tcp_client.cpp @@ -61,9 +61,6 @@ int tcp_client::join(std::string addrstr) for (auto i = 0; i < NoSleep; ++i) { try { poll(); - } catch (const dvlnet_exception &e) { - SDL_SetError("Network error: %s", e.what()); - return -1; } catch (const std::runtime_error &e) { SDL_SetError("%s", e.what()); return -1; diff --git a/Source/dvlnet/tcp_server.cpp b/Source/dvlnet/tcp_server.cpp index d1b1a538a..61f53956d 100644 --- a/Source/dvlnet/tcp_server.cpp +++ b/Source/dvlnet/tcp_server.cpp @@ -79,27 +79,25 @@ void tcp_server::HandleReceive(const scc &con, const asio::error_code &ec, con->recv_buffer.resize(frame_queue::max_frame_size); try { while (con->recv_queue.PacketReady()) { - try { - tl::expected, PacketError> pkt = pktfty.make_packet(con->recv_queue.ReadPacket()); - if (!pkt.has_value()) { - Log("make_packet: {}", pkt.error().what()); + tl::expected, PacketError> pkt = pktfty.make_packet(con->recv_queue.ReadPacket()); + if (!pkt.has_value()) { + Log("make_packet: {}", pkt.error().what()); + DropConnection(con); + return; + } + if (con->plr == PLR_BROADCAST) { + if (tl::expected result = HandleReceiveNewPlayer(con, **pkt); !result.has_value()) { + Log("HandleReceiveNewPlayer: {}", result.error().what()); DropConnection(con); return; } - if (con->plr == PLR_BROADCAST) { - if (tl::expected result = HandleReceiveNewPlayer(con, **pkt); !result.has_value()) { - Log("HandleReceiveNewPlayer: {}", result.error().what()); - DropConnection(con); - return; - } - } else { - con->timeout = timeout_active; - HandleReceivePacket(**pkt); + } else { + con->timeout = timeout_active; + if (tl::expected result = HandleReceivePacket(**pkt); !result.has_value()) { + Log("Network error: {}", result.error().what()); + DropConnection(con); + return; } - } catch (dvlnet_exception &e) { - Log("Network error: {}", e.what()); - DropConnection(con); - return; } } } catch (frame_queue_exception &e) { @@ -114,7 +112,7 @@ tl::expected tcp_server::HandleReceiveNewPlayer(const scc &co { auto newplr = NextFree(); if (newplr == PLR_BROADCAST) - throw server_exception(); + return tl::make_unexpected(ServerError()); if (Empty()) { tl::expected pktInfo = inPkt.Info(); @@ -158,12 +156,12 @@ tl::expected tcp_server::HandleReceiveNewPlayer(const scc &co return {}; } -void tcp_server::HandleReceivePacket(packet &pkt) +tl::expected tcp_server::HandleReceivePacket(packet &pkt) { - SendPacket(pkt); + return SendPacket(pkt); } -void tcp_server::SendPacket(packet &pkt) +tl::expected tcp_server::SendPacket(packet &pkt) { if (pkt.Destination() == PLR_BROADCAST) { for (size_t i = 0; i < Players.size(); ++i) @@ -171,10 +169,11 @@ void tcp_server::SendPacket(packet &pkt) StartSend(connections[i], pkt); } else { if (pkt.Destination() >= MAX_PLRS) - throw server_exception(); + return tl::make_unexpected(ServerError()); if ((pkt.Destination() != pkt.Source()) && connections[pkt.Destination()]) StartSend(connections[pkt.Destination()], pkt); } + return {}; } void tcp_server::StartSend(const scc &con, packet &pkt) diff --git a/Source/dvlnet/tcp_server.h b/Source/dvlnet/tcp_server.h index 36b69c82a..6e258e71f 100644 --- a/Source/dvlnet/tcp_server.h +++ b/Source/dvlnet/tcp_server.h @@ -27,9 +27,9 @@ namespace devilution::net { -class server_exception : public dvlnet_exception { +class ServerError : public PacketError { public: - const char *what() const throw() override + const char *what() const override { return "Invalid player ID"; } @@ -77,8 +77,8 @@ private: void StartReceive(const scc &con); void HandleReceive(const scc &con, const asio::error_code &ec, size_t bytesRead); tl::expected HandleReceiveNewPlayer(const scc &con, packet &pkt); - void HandleReceivePacket(packet &pkt); - void SendPacket(packet &pkt); + tl::expected HandleReceivePacket(packet &pkt); + tl::expected SendPacket(packet &pkt); void StartSend(const scc &con, packet &pkt); void HandleSend(const scc &con, const asio::error_code &ec, size_t bytesSent); void StartTimeout(const scc &con);