|
9 | 9 |
|
10 | 10 | #include <QVector> |
11 | 11 |
|
12 | | -#define HEARTBEAT_RATE 1000 |
| 12 | +#define HEARTBEAT_RATE 5000 |
| 13 | +#define HEARTBEAT_RATE_UDP 1000 // We don't actually respond to these, they're just to keep the connection alive |
13 | 14 |
|
14 | 15 | static std::chrono::time_point<std::chrono::steady_clock> lastHeartbeat; |
| 16 | +static std::chrono::time_point<std::chrono::steady_clock> lastHeartbeatUdp; |
15 | 17 |
|
16 | 18 | //DataGhost |
17 | 19 |
|
@@ -209,6 +211,7 @@ void NetworkManager::CheckConnection() |
209 | 211 | client.currentMap = level_name; |
210 | 212 | client.TCP_only = TCP_only; |
211 | 213 | client.returnedHeartbeat = true; // Make sure they don't get immediately disconnected; their heartbeat starts on next beat |
| 214 | + client.missedLastHeartbeat = false; |
212 | 215 |
|
213 | 216 | this->selector.add(*client.tcpSocket); |
214 | 217 |
|
@@ -386,6 +389,17 @@ void NetworkManager::RunServer() |
386 | 389 | lastHeartbeat = now; |
387 | 390 | } |
388 | 391 |
|
| 392 | + if (now > lastHeartbeatUdp + std::chrono::milliseconds(HEARTBEAT_RATE_UDP)) { |
| 393 | + for (auto &client : this->clients) { |
| 394 | + if (!client.TCP_only) { |
| 395 | + sf::Packet packet; |
| 396 | + packet << HEADER::HEART_BEAT << sf::Uint32(client.ID) << sf::Uint32(0); |
| 397 | + this->udpSocket.send(packet, client.IP, client.port); |
| 398 | + } |
| 399 | + } |
| 400 | + lastHeartbeatUdp = now; |
| 401 | + } |
| 402 | + |
389 | 403 | //UDP |
390 | 404 | std::vector<sf::Packet> buffer; |
391 | 405 | this->ReceiveUDPUpdates(buffer); |
@@ -427,12 +441,13 @@ void NetworkManager::DoHeartbeats() |
427 | 441 | std::queue<Client*> toDisconnect; |
428 | 442 |
|
429 | 443 | for (auto& client : this->clients) { |
430 | | - if (!client.returnedHeartbeat) { |
| 444 | + if (!client.returnedHeartbeat && client.missedLastHeartbeat) { |
431 | 445 | // Client didn't return heartbeat in time; sever connection |
432 | 446 | toDisconnect.push(&client); |
433 | 447 | } else { |
434 | 448 | // Send a heartbeat |
435 | 449 | client.heartbeatToken = rand(); |
| 450 | + client.missedLastHeartbeat = !client.returnedHeartbeat; |
436 | 451 | client.returnedHeartbeat = false; |
437 | 452 | sf::Packet packet; |
438 | 453 | packet << HEADER::HEART_BEAT << sf::Uint32(client.ID) << sf::Uint32(client.heartbeatToken); |
|
0 commit comments