Skip to content

Commit ebc708e

Browse files
committed
Server now correctly handles client disconnection
1 parent cc8fe72 commit ebc708e

6 files changed

Lines changed: 52 additions & 17 deletions

File tree

examples/SimpleClientServer/application.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -118,24 +118,24 @@ void initGame(int argc, char** argv)
118118
// Todo delete this somewhere (should be when the system is deleted)
119119
auto *backend = new SdlNetworkBackend(netCfg);
120120

121-
mainWindow->ecs.createSystem<NetworkSystem>(backend, netCfg);
121+
mainWindow->ecs->createSystem<NetworkSystem>(backend, netCfg);
122122

123123
if (not isServer)
124124
{
125-
mainWindow->ecs.createSystem<TestSystem>();
125+
mainWindow->ecs->createSystem<TestSystem>();
126126
}
127127

128128
// SDL_Quit();
129129

130130
printf("Engine initialized ...\n");
131131

132-
mainWindow->ecs.dumbTaskflow();
132+
mainWindow->ecs->dumbTaskflow();
133133

134134
mainWindow->render();
135135

136136
mainWindow->resize(820, 640);
137137

138-
mainWindow->ecs.start();
138+
mainWindow->ecs->start();
139139

140140
printf("Engine initialized\n");
141141
}

src/Engine/Networking/backend_sdl.cpp

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,15 @@ namespace pg
132132
return _isConnectedToServer;
133133
}
134134

135+
void SdlNetworkBackend::closeTcp(SocketHandle sock)
136+
{
137+
if (sock)
138+
{
139+
SDLNet_TCP_DelSocket(sockSet, static_cast<TCPsocket>(sock));
140+
SDLNet_TCP_Close(static_cast<TCPsocket>(sock));
141+
}
142+
}
143+
135144
bool SdlNetworkBackend::sendTcp(SocketHandle sock, const NetPayload& data)
136145
{
137146
if (not sock)
@@ -222,9 +231,6 @@ namespace pg
222231
}
223232
else
224233
{
225-
SDLNet_TCP_DelSocket(sockSet, _tcpSock);
226-
SDLNet_TCP_Close(_tcpSock);
227-
_tcpSock = nullptr;
228234
_isConnectedToServer = false;
229235
LOG_ERROR(DOM, "TCP receive failed, disconnected from server !");
230236
}
@@ -289,10 +295,6 @@ namespace pg
289295
}
290296
else
291297
{
292-
SDLNet_TCP_DelSocket(socketSet, tcpSock);
293-
SDLNet_TCP_Close(tcpSock);
294-
295-
tcpSock = nullptr;
296298
socketClosed = true;
297299
LOG_ERROR(DOM, "TCP receive failed, disconnected from server !");
298300
}
@@ -316,10 +318,6 @@ namespace pg
316318
}
317319
else
318320
{
319-
SDLNet_TCP_DelSocket(sockSet, _tcpSock);
320-
SDLNet_TCP_Close(_tcpSock);
321-
322-
_tcpSock = nullptr;
323321
_isConnectedToServer = false;
324322
socketClosed = true;
325323

src/Engine/Networking/backend_sdl.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ namespace pg
2121
// Client‐side: connect to server using cfg.peerAddress/cfg.tcpPort
2222
bool connectToServer() override;
2323

24+
virtual void closeTcp(SocketHandle sock) override;
25+
2426
// Send raw data
2527
bool sendUdp(const IpEndpoint& dest, const NetPayload& data) override;
2628
bool sendTcp(SocketHandle sock, const NetPayload& data) override;

src/Engine/Networking/ibackend.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ namespace pg
2323
bool _isConnectedToServer = false;
2424
inline bool isConnectedToServer() const { return _isConnectedToServer; }
2525

26+
virtual void closeTcp(SocketHandle sock) = 0;
27+
2628
// Send raw packet (header+payload)
2729
virtual bool sendUdp(const IpEndpoint& dest, const NetPayload& data) = 0;
2830
virtual bool sendTcp(SocketHandle sock, const NetPayload& data) = 0;

src/Engine/Networking/network_system.cpp

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ namespace pg
204204
// 2) Process incoming packets
205205
// Process Tcp data
206206

207-
auto now = getCurrentTime();
207+
std::set<uint32_t> disconnectedClients;
208208

209209
for (auto& client : clients)
210210
{
@@ -217,6 +217,7 @@ namespace pg
217217
{
218218
if (sendTCPMessage(ci.clientId, ci.token, NetMsgType::Ping, {0}, ci.tcpSock))
219219
{
220+
auto now = getCurrentTime();
220221
LOG_INFO("NetSys", "Sent ping to client: " << ci.clientId << " at time: " << now);
221222
ci.lastPingSentMs = 0;
222223
}
@@ -241,6 +242,14 @@ namespace pg
241242
handleServerMessage(msg.header, msg.payload);
242243
}
243244
}
245+
246+
if (tcpClosed)
247+
{
248+
LOG_WARNING("NetSys", "TCP connection closed by client: " << ci.clientId);
249+
250+
disconnectedClients.insert(ci.clientId);
251+
break;
252+
}
244253
}
245254

246255
// Process Udp data
@@ -259,6 +268,11 @@ namespace pg
259268
}
260269
// LOG_INFO("NetSys", "Received UDP request from ip: " << ipPortKey(ip));
261270
}
271+
272+
for (auto id : disconnectedClients)
273+
{
274+
disconnectClient(id);
275+
}
262276
}
263277

264278
void NetworkSystem::runClientFrame(float dt)
@@ -363,4 +377,21 @@ namespace pg
363377
handleMessage(header, payload);
364378
}
365379

380+
void NetworkSystem::disconnectClient(uint32_t id)
381+
{
382+
auto it = idToTcp.find(id);
383+
384+
if (it != idToTcp.end())
385+
{
386+
auto tcpSock = it->second;
387+
388+
clients.erase(tcpSock);
389+
idToTcp.erase(it);
390+
391+
backend->closeTcp(tcpSock);
392+
393+
LOG_INFO("NetSys", "Client " << id << " disconnected and cleaned up");
394+
}
395+
}
396+
366397
} // namespace pg

src/Engine/Networking/network_system.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ namespace pg
139139
size_t nextPacketNumber = 0;
140140

141141
// Reassembly‐buffer timestamping:
142-
std::map<uint32_t, uint64_t> fragmentTimers; // packetNumber first‐seen timestamp
142+
std::map<uint32_t, uint64_t> fragmentTimers; // packetNumber -> first‐seen timestamp
143143
NetPacketBuffer reassembly;
144144

145145
// Server state
@@ -178,6 +178,8 @@ namespace pg
178178
void handleMessage(const PacketHeader& header, const NetPayload& payload);
179179
void handleServerMessage(const PacketHeader& header, const NetPayload& payload);
180180
void handleClientMessage(const PacketHeader& header, const NetPayload& payload);
181+
182+
void disconnectClient(uint32_t id);
181183
};
182184

183185
}

0 commit comments

Comments
 (0)