1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-18 12:33:17 +01:00

measure and display ping

This commit is contained in:
zsilencer
2015-07-16 18:24:39 -06:00
parent 7ccb0eb655
commit d772f8b5fb
6 changed files with 196 additions and 25 deletions

View File

@@ -51,6 +51,8 @@ enum {
NETWORK_COMMAND_GAMECMD,
NETWORK_COMMAND_TICK,
NETWORK_COMMAND_PLAYERLIST,
NETWORK_COMMAND_PING,
NETWORK_COMMAND_PINGLIST,
NETWORK_COMMAND_MAX
};
@@ -125,6 +127,7 @@ NetworkPlayer::NetworkPlayer(const char* name)
strncpy((char*)NetworkPlayer::name, name, sizeof(NetworkPlayer::name));
NetworkPlayer::name[sizeof(NetworkPlayer::name) - 1] = 0;
ping = 0;
flags = 0;
}
NetworkConnection::NetworkConnection()
@@ -216,6 +219,7 @@ Network::Network()
wsa_initialized = false;
mode = NETWORK_MODE_NONE;
last_tick_sent_time = 0;
last_ping_sent_time = 0;
strcpy(password, "");
client_command_handlers.resize(NETWORK_COMMAND_MAX, 0);
client_command_handlers[NETWORK_COMMAND_AUTH] = &Network::Client_Handle_AUTH;
@@ -224,10 +228,13 @@ Network::Network()
client_command_handlers[NETWORK_COMMAND_GAMECMD] = &Network::Client_Handle_GAMECMD;
client_command_handlers[NETWORK_COMMAND_TICK] = &Network::Client_Handle_TICK;
client_command_handlers[NETWORK_COMMAND_PLAYERLIST] = &Network::Client_Handle_PLAYERLIST;
client_command_handlers[NETWORK_COMMAND_PING] = &Network::Client_Handle_PING;
client_command_handlers[NETWORK_COMMAND_PINGLIST] = &Network::Client_Handle_PINGLIST;
server_command_handlers.resize(NETWORK_COMMAND_MAX, 0);
server_command_handlers[NETWORK_COMMAND_AUTH] = &Network::Server_Handle_AUTH;
server_command_handlers[NETWORK_COMMAND_CHAT] = &Network::Server_Handle_CHAT;
server_command_handlers[NETWORK_COMMAND_GAMECMD] = &Network::Server_Handle_GAMECMD;
server_command_handlers[NETWORK_COMMAND_PING] = &Network::Server_Handle_PING;
}
Network::~Network()
@@ -348,9 +355,8 @@ bool Network::BeginServer(unsigned short port)
return false;
}
std::unique_ptr<NetworkPlayer> player(new NetworkPlayer("Server Player")); // change to make_unique in c++14
NetworkPlayer* player = AddPlayer("Server Player");
player->flags |= NETWORK_PLAYER_FLAG_ISSERVER;
player_list.push_back(std::move(player));
printf("Ready for clients...\n");
@@ -405,6 +411,11 @@ void Network::Update()
last_tick_sent_time = SDL_GetTicks();
Server_Send_TICK();
}
if (SDL_GetTicks() - last_ping_sent_time >= 3000) {
last_ping_sent_time = SDL_GetTicks();
Server_Send_PING();
Server_Send_PINGLIST();
}
SOCKET socket = accept(listening_socket, NULL, NULL);
if (socket == INVALID_SOCKET) {
if (WSAGetLastError() != WSAEWOULDBLOCK) {
@@ -423,6 +434,14 @@ void Network::Update()
}
}
NetworkPlayer* Network::GetPlayerByID(int id) {
auto it = std::find_if(player_list.begin(), player_list.end(), [&id](std::unique_ptr<NetworkPlayer> const& player) { return player->id == id; });
if (it != player_list.end()) {
return (*it).get();
}
return 0;
}
void Network::Client_Send_AUTH(const char* gameversion, const char* name, const char* password)
{
std::unique_ptr<NetworkPacket> packet = NetworkPacket::AllocatePacket();
@@ -510,6 +529,35 @@ void Network::Server_Send_PLAYERLIST()
}
}
void Network::Client_Send_PING()
{
std::unique_ptr<NetworkPacket> packet = NetworkPacket::AllocatePacket();
*packet << (uint32)NETWORK_COMMAND_PING;
server_connection.QueuePacket(std::move(packet));
}
void Network::Server_Send_PING()
{
std::unique_ptr<NetworkPacket> packet = NetworkPacket::AllocatePacket();
*packet << (uint32)NETWORK_COMMAND_PING;
for (auto it = client_connection_list.begin(); it != client_connection_list.end(); it++) {
(*it)->ping_time = SDL_GetTicks();
(*it)->QueuePacket(NetworkPacket::DuplicatePacket(*packet));
}
}
void Network::Server_Send_PINGLIST()
{
std::unique_ptr<NetworkPacket> packet = NetworkPacket::AllocatePacket();
*packet << (uint32)NETWORK_COMMAND_PINGLIST << (uint32)player_list.size();
for (unsigned int i = 0; i < player_list.size(); i++) {
*packet << player_list[i]->id << player_list[i]->ping;
}
for (auto it = client_connection_list.begin(); it != client_connection_list.end(); it++) {
(*it)->QueuePacket(NetworkPacket::DuplicatePacket(*packet));
}
}
bool Network::ProcessConnection(NetworkConnection& connection)
{
int packetStatus;
@@ -592,6 +640,33 @@ void Network::RemoveClient(std::unique_ptr<NetworkConnection>& connection)
Server_Send_PLAYERLIST();
}
NetworkPlayer* Network::AddPlayer(const char* name)
{
NetworkPlayer* addedplayer = 0;
int newid = -1;
if (GetMode() == NETWORK_MODE_SERVER) {
// Find first unused player id
for (int id = 0; id < 255; id++) {
if (std::find_if(player_list.begin(), player_list.end(), [&id](std::unique_ptr<NetworkPlayer> const& player) { return player->id == id; }) == player_list.end()) {
newid = id;
break;
}
}
} else {
newid = 0;
}
if (newid != -1) {
std::unique_ptr<NetworkPlayer> player(new NetworkPlayer(name)); // change to make_unique in c++14
player->id = newid;
addedplayer = player.get();
player_list.push_back(std::move(player));
if (GetMode() == NETWORK_MODE_SERVER) {
Server_Send_PLAYERLIST();
}
}
return addedplayer;
}
void Network::PrintError()
{
wchar_t *s = NULL;
@@ -622,11 +697,8 @@ int Network::Server_Handle_AUTH(NetworkConnection& connection, NetworkPacket& pa
connection.authstatus = NETWORK_AUTH_BADPASSWORD;
} else {
connection.authstatus = NETWORK_AUTH_OK;
std::unique_ptr<NetworkPlayer> player(new NetworkPlayer(name)); // change to make_unique in c++14
printf("New player: %s\n", player->name);
connection.player = player.get();
player_list.push_back(std::move(player));
Server_Send_PLAYERLIST();
NetworkPlayer* player = AddPlayer(name);
connection.player = player;
}
std::unique_ptr<NetworkPacket> responsepacket = NetworkPacket::AllocatePacket();
*responsepacket << (uint32)NETWORK_COMMAND_AUTH << (uint32)connection.authstatus;
@@ -726,12 +798,47 @@ int Network::Client_Handle_PLAYERLIST(NetworkConnection& connection, NetworkPack
packet >> size;
for (unsigned int i = 0; i < size; i++) {
const char* name = packet.ReadString();
std::unique_ptr<NetworkPlayer> player(new NetworkPlayer(name)); // change to make_unique in c++14
packet >> player->id >> player->flags;
if (player->flags & NETWORK_PLAYER_FLAG_ISSERVER) {
server_connection.player = player.get();
NetworkPlayer* player = AddPlayer(name);
if (player) {
packet >> player->id >> player->flags;
if (player->flags & NETWORK_PLAYER_FLAG_ISSERVER) {
server_connection.player = player;
}
}
}
return 1;
}
int Network::Client_Handle_PING(NetworkConnection& connection, NetworkPacket& packet)
{
Client_Send_PING();
return 1;
}
int Network::Server_Handle_PING(NetworkConnection& connection, NetworkPacket& packet)
{
int ping = SDL_GetTicks() - connection.ping_time;
if (ping < 0) {
ping = 0;
}
if (connection.player) {
connection.player->ping = ping;
}
return 1;
}
int Network::Client_Handle_PINGLIST(NetworkConnection& connection, NetworkPacket& packet)
{
uint32 size;
packet >> size;
for (unsigned int i = 0; i < size; i++) {
uint8 id;
uint16 ping;
packet >> id >> ping;
NetworkPlayer* player = GetPlayerByID(id);
if (player) {
player->ping = ping;
}
player_list.push_back(std::move(player));
}
return 1;
}
@@ -786,6 +893,16 @@ const char* network_get_player_name(unsigned int index)
return (const char*)gNetwork.player_list[index]->name;
}
uint32 network_get_player_flags(unsigned int index)
{
return gNetwork.player_list[index]->flags;
}
int network_get_player_ping(unsigned int index)
{
return gNetwork.player_list[index]->ping;
}
void network_send_map()
{
gNetwork.Server_Send_MAP();