Browse Source

Avoid sending PT_DISCONNECT packet to dropped player

pull/8240/head
staphen 2 years ago committed by Anders Jenbo
parent
commit
77de9e8f66
  1. 6
      Source/dvlnet/base.cpp
  2. 6
      Source/dvlnet/tcp_client.cpp
  3. 1
      Source/dvlnet/tcp_client.h
  4. 25
      Source/dvlnet/tcp_server.cpp
  5. 1
      Source/dvlnet/tcp_server.h

6
Source/dvlnet/base.cpp

@ -409,10 +409,14 @@ bool base::SNetLeaveGame(int type)
bool base::SNetDropPlayer(int playerid, uint32_t flags)
{
const plr_t plr = static_cast<plr_t>(playerid);
auto pkt = pktfty->make_packet<PT_DISCONNECT>(plr_self,
PLR_BROADCAST,
static_cast<plr_t>(playerid),
plr,
static_cast<leaveinfo_t>(flags));
// Disconnect at the network layer first so we
// don't send players their own disconnect packet
DisconnectNet(plr);
send(*pkt);
RecvLocal(*pkt);
return true;

6
Source/dvlnet/tcp_client.cpp

@ -123,6 +123,12 @@ void tcp_client::send(packet &pkt)
});
}
void tcp_client::DisconnectNet(plr_t plr)
{
if (local_server != nullptr)
local_server->DisconnectNet(plr);
}
bool tcp_client::SNetLeaveGame(int type)
{
auto ret = base::SNetLeaveGame(type);

1
Source/dvlnet/tcp_client.h

@ -23,6 +23,7 @@ public:
void poll() override;
void send(packet &pkt) override;
void DisconnectNet(plr_t plr) override;
bool SNetLeaveGame(int type) override;

25
Source/dvlnet/tcp_server.cpp

@ -212,16 +212,27 @@ void tcp_server::HandleTimeout(const scc &con, const asio::error_code &ec)
void tcp_server::DropConnection(const scc &con)
{
if (con->plr != PLR_BROADCAST) {
auto pkt = pktfty.make_packet<PT_DISCONNECT>(PLR_MASTER, PLR_BROADCAST,
con->plr, static_cast<leaveinfo_t>(LEAVE_DROP));
connections[con->plr] = nullptr;
SendPacket(*pkt);
// TODO: investigate if it is really ok for the server to
// drop a client directly.
plr_t plr = con->plr;
con->timer.cancel();
con->socket.close();
if (plr == PLR_BROADCAST) {
return;
}
connections[plr] = nullptr;
auto pkt = pktfty.make_packet<PT_DISCONNECT>(PLR_MASTER, PLR_BROADCAST,
con->plr, static_cast<leaveinfo_t>(LEAVE_DROP));
SendPacket(*pkt);
}
void tcp_server::DisconnectNet(plr_t plr)
{
scc &con = connections[plr];
if (con == nullptr)
return;
con->timer.cancel();
con->socket.close();
con = nullptr;
}
void tcp_server::Close()

1
Source/dvlnet/tcp_server.h

@ -30,6 +30,7 @@ public:
tcp_server(asio::io_context &ioc, const std::string &bindaddr,
unsigned short port, packet_factory &pktfty);
std::string LocalhostSelf();
void DisconnectNet(plr_t plr);
void Close();
virtual ~tcp_server();

Loading…
Cancel
Save