Exemple #1
0
/*
 * @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();
	}
}
Exemple #2
0
/**
 * @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();
	}
}