From 6c4bad0af19a98c598480902e31d10fbab25e7d8 Mon Sep 17 00:00:00 2001 From: Xadhoom Date: Wed, 28 Apr 2021 07:40:23 +0000 Subject: [PATCH] ZeroTier networking fixes --- Source/dvlnet/base_protocol.h | 8 +++++++- Source/dvlnet/protocol_zt.cpp | 14 ++++++++++++-- Source/dvlnet/protocol_zt.h | 7 +++++++ 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/Source/dvlnet/base_protocol.h b/Source/dvlnet/base_protocol.h index 29cfc1704..4db28ed7f 100644 --- a/Source/dvlnet/base_protocol.h +++ b/Source/dvlnet/base_protocol.h @@ -186,6 +186,13 @@ void base_protocol

::recv() Log("{}", e.what()); } } + while (proto.get_disconnected(sender)) { + for (plr_t i = 0; i < MAX_PLRS; ++i) { + if (peers[i] == sender) { + disconnect_net(i); + } + } + } } catch (std::exception &e) { Log("{}", e.what()); return; @@ -210,7 +217,6 @@ void base_protocol

::handle_join_request(packet &pkt, endpoint sender) if ((j != plr_self) && (j != i) && peers[j]) { auto infopkt = pktfty->make_packet(PLR_MASTER, PLR_BROADCAST, j, peers[j].serialize()); proto.send(sender, infopkt->data()); - break; } } auto reply = pktfty->make_packet(plr_self, PLR_BROADCAST, diff --git a/Source/dvlnet/protocol_zt.cpp b/Source/dvlnet/protocol_zt.cpp index 8ea0f004b..0103e4e2d 100644 --- a/Source/dvlnet/protocol_zt.cpp +++ b/Source/dvlnet/protocol_zt.cpp @@ -164,7 +164,7 @@ bool protocol_zt::send_queued_all() { for (auto &peer : peer_list) { if (!send_queued_peer(peer.first)) { - // disconnect this peer + // handle error? } } return true; @@ -175,7 +175,7 @@ bool protocol_zt::recv_from_peers() for (auto &peer : peer_list) { if (peer.second.fd != -1) { if (!recv_peer(peer.first)) { - // error, disconnect? + disconnect_queue.push_back(peer.first); } } } @@ -244,6 +244,16 @@ bool protocol_zt::recv(endpoint &peer, buffer_t &data) return false; } +bool protocol_zt::get_disconnected(endpoint &peer) +{ + if (!disconnect_queue.empty()) { + peer = disconnect_queue.front(); + disconnect_queue.pop_front(); + return true; + } + return false; +} + void protocol_zt::disconnect(const endpoint &peer) { if (peer_list.count(peer)) { diff --git a/Source/dvlnet/protocol_zt.h b/Source/dvlnet/protocol_zt.h index a848cea87..f18170c6c 100644 --- a/Source/dvlnet/protocol_zt.h +++ b/Source/dvlnet/protocol_zt.h @@ -34,6 +34,11 @@ public: return (addr != empty); } + bool operator==(const endpoint &rhs) const + { + return addr == rhs.addr; + } + bool operator<(const endpoint &rhs) const { return addr < rhs.addr; @@ -61,6 +66,7 @@ public: bool send_oob(const endpoint &peer, const buffer_t &data); bool send_oob_mc(const buffer_t &data); bool recv(endpoint &peer, buffer_t &data); + bool get_disconnected(endpoint &peer); bool network_online(); static std::string make_default_gamename(); @@ -75,6 +81,7 @@ private: }; std::deque> oob_recv_queue; + std::deque disconnect_queue; std::map peer_list; int fd_tcp = -1;