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;