/* * @brief */ int32_t main(int32_t argc, char **argv) { struct sockaddr_in address, from; struct timeval delay; socklen_t from_len; fd_set set; char buffer[16384]; printf("Quake2World Master Server %s %s %s\n", VERSION, __DATE__, BUILD_HOST); memset(&quake2world, 0, sizeof(quake2world)); quake2world.Init = Init; quake2world.Shutdown = Shutdown; signal(SIGHUP, Sys_Signal); signal(SIGINT, Sys_Signal); signal(SIGQUIT, Sys_Signal); signal(SIGILL, Sys_Signal); signal(SIGTRAP, Sys_Signal); signal(SIGFPE, Sys_Signal); signal(SIGSEGV, Sys_Signal); signal(SIGTERM, Sys_Signal); Com_Init(argc, argv); ms_sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); memset(&address, 0, sizeof(address)); address.sin_family = AF_INET; address.sin_port = htons(PORT_MASTER); address.sin_addr.s_addr = INADDR_ANY; if ((bind(ms_sock, (struct sockaddr *) &address, sizeof(address))) == -1) { Com_Print("Failed to bind port %i\n", PORT_MASTER); return 1; } Com_Print("Listening on %i\n", PORT_MASTER); while (true) { FD_ZERO(&set); FD_SET(ms_sock, &set); memset(&delay, 0, sizeof(struct timeval)); delay.tv_sec = 1; delay.tv_usec = 0; if (select(ms_sock + 1, &set, NULL, NULL, &delay) > 0) { if (FD_ISSET(ms_sock, &set)) { from_len = sizeof(from); memset(buffer, 0, sizeof(buffer)); const ssize_t len = recvfrom(ms_sock, buffer, sizeof(buffer), 0, (struct sockaddr *) &from, &from_len); if (len > 0) { if (len > 4) Ms_ParseMessage(&from, buffer); else Com_Print("Invalid packet from %s:%d\n", inet_ntoa(from.sin_addr), ntohs(from.sin_port)); } else { Com_Print("Socket error from %s:%d (%s)\n", inet_ntoa(from.sin_addr), ntohs(from.sin_port), strerror(errno)); } } } Ms_RunFrame(); } }
/** * @brief */ int32_t main(int32_t argc, char **argv) { printf("Quetoo Master Server %s %s %s\n", VERSION, __DATE__, BUILD_HOST); memset(&quetoo, 0, sizeof(quetoo)); quetoo.Debug = Debug; quetoo.Verbose = Verbose; quetoo.Init = Init; quetoo.Shutdown = Shutdown; signal(SIGINT, Sys_Signal); signal(SIGQUIT, Sys_Signal); signal(SIGSEGV, Sys_Signal); signal(SIGTERM, Sys_Signal); Com_Init(argc, argv); int32_t i; for (i = 0; i < Com_Argc(); i++) { if (!g_strcmp0(Com_Argv(i), "-v") || !g_strcmp0(Com_Argv(i), "-verbose")) { verbose = true; continue; } if (!g_strcmp0(Com_Argv(i), "-d") || !g_strcmp0(Com_Argv(i), "-debug")) { debug = true; continue; } } ms_sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); struct sockaddr_in address; memset(&address, 0, sizeof(address)); address.sin_family = AF_INET; address.sin_port = htons(PORT_MASTER); address.sin_addr.s_addr = INADDR_ANY; if ((bind(ms_sock, (struct sockaddr *) &address, sizeof(address))) == -1) { Com_Error(ERROR_FATAL, "Failed to bind port %i\n", PORT_MASTER); } Com_Print("Listening on %s\n", atos(&address)); while (true) { fd_set set; FD_ZERO(&set); FD_SET(ms_sock, &set); struct timeval delay; delay.tv_sec = 1; delay.tv_usec = 0; if (select(ms_sock + 1, &set, NULL, NULL, &delay) > 0) { if (FD_ISSET(ms_sock, &set)) { char buffer[0xffff]; memset(buffer, 0, sizeof(buffer)); struct sockaddr_in from; memset(&from, 0, sizeof(from)); socklen_t from_len = sizeof(from); const ssize_t len = recvfrom(ms_sock, buffer, sizeof(buffer), 0, (struct sockaddr *) &from, &from_len); if (len > 0) { if (len > 4) { Ms_ParseMessage(&from, buffer); } else { Com_Warn("Invalid packet from %s\n", atos(&from)); } } else { Com_Warn("Socket error: %s\n", strerror(errno)); } } } Ms_Frame(); } }