/** * @brief */ static void Ms_ParseMessage(struct sockaddr_in *from, char *data) { char *cmd = data; char *line = data; while (*line && *line != '\n') { line++; } *(line++) = '\0'; cmd += 4; if (!g_ascii_strncasecmp(cmd, "ping", 4)) { Ms_AddServer(from); } else if (!g_ascii_strncasecmp(cmd, "heartbeat", 9) || !g_ascii_strncasecmp(cmd, "print", 5)) { Ms_Heartbeat(from); } else if (!g_ascii_strncasecmp(cmd, "ack", 3)) { Ms_Ack(from); } else if (!g_ascii_strncasecmp(cmd, "shutdown", 8)) { Ms_RemoveServer(from); } else if (!g_ascii_strncasecmp(cmd, "getservers", 10) || !g_ascii_strncasecmp(cmd, "y", 1)) { Ms_GetServers(from); } else { Com_Warn("Unknown command from %s: '%s'", atos(from), cmd); } }
/** * @brief Accept a "heartbeat" from the specified server address. */ static void Ms_Heartbeat(struct sockaddr_in *from) { ms_server_t *server = Ms_GetServer(from); if (server) { server->last_heartbeat = time(NULL); Com_Verbose("Heartbeat from %s\n", stos(server)); const void *ack = "\xFF\xFF\xFF\xFF" "ack"; sendto(ms_sock, ack, 7, 0, (struct sockaddr *) &server->addr, sizeof(server->addr)); } else { Ms_AddServer(from); } }
/* * @brief */ static void Ms_Heartbeat(struct sockaddr_in *from) { ms_server_t *server; struct sockaddr_in addr; if ((server = Ms_GetServer(from))) { // update their timestamp addr.sin_addr = server->ip.sin_addr; addr.sin_family = AF_INET; addr.sin_port = server->port; memset(&addr.sin_zero, 0, sizeof(addr.sin_zero)); server->validated = true; server->last_heartbeat = time(0); Com_Print("Heartbeat from %s.\n", inet_ntoa(server->ip.sin_addr)); sendto(ms_sock, "\xFF\xFF\xFF\xFF" "ack", 7, 0, (struct sockaddr*) &addr, sizeof(addr)); return; } Ms_AddServer(from); }
/* * @brief */ static void Ms_ParseMessage(struct sockaddr_in *from, char *data) { char *cmd = data; char *line = data; while (*line && *line != '\n') line++; *(line++) = '\0'; cmd += 4; if (!strncasecmp(cmd, "ping", 4)) { Ms_AddServer(from); } else if (!strncasecmp(cmd, "heartbeat", 9) || !strncasecmp(cmd, "print", 5)) { Ms_Heartbeat(from); } else if (!strncasecmp(cmd, "ack", 3)) { Ms_Ack(from); } else if (!strncasecmp(cmd, "shutdown", 8)) { Ms_RemoveServer(from, NULL); } else if (!strncasecmp(cmd, "getservers", 10) || !strncasecmp(cmd, "y", 1)) { Ms_SendServersList(from); } else { Com_Print("Unknown command from %s: '%s'", inet_ntoa(from->sin_addr), cmd); } }