summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/base/net_multiplayer.h3
-rw-r--r--src/base/storage.c2
-rw-r--r--src/screen/screen_browser.c93
-rw-r--r--src/screen/screen_browser.h3
-rw-r--r--src/server/publicServer.c109
5 files changed, 176 insertions, 34 deletions
diff --git a/src/base/net_multiplayer.h b/src/base/net_multiplayer.h
index ad5eb41..aacd55f 100644
--- a/src/base/net_multiplayer.h
+++ b/src/base/net_multiplayer.h
@@ -23,6 +23,9 @@
#define LIMIT_BUFFER 10240
+#define NET_MASTER_SERVER "193.85.244.165"
+#define NET_MASTER_PORT 2200
+
#ifdef PUBLIC_SERVER
extern int initNetMulitplayerPublicServer(char *ip4, int port4, char *ip6, int port6);
#endif
diff --git a/src/base/storage.c b/src/base/storage.c
index f3eb937..0d48711 100644
--- a/src/base/storage.c
+++ b/src/base/storage.c
@@ -112,7 +112,7 @@ void delAllItemFromStorage(list_t *list, char *group, void *f)
assert( list != NULL );
assert( group != NULL );
-
+
for(i = 0 ; i < list->count; i++)
{
this = (storage_item_t *) list->list[i];
diff --git a/src/screen/screen_browser.c b/src/screen/screen_browser.c
index 3307423..bbf1f24 100644
--- a/src/screen/screen_browser.c
+++ b/src/screen/screen_browser.c
@@ -99,11 +99,14 @@ void stopScreenBrowser()
server->next->prev = server->prev;
server->prev->next = server->next;
- //if (server->version)
- // free (server->version);
+ if (server->name)
+ free (server->name);
- //if (server->arena)
- //free (server->arena);
+ if (server->version)
+ free (server->version);
+
+ if (server->arena)
+ free (server->arena);
free (server);
@@ -181,15 +184,13 @@ int server_getinfo (server_t *server)
}
struct timeval tv;
- // Množina
+
fd_set myset;
- // Množina obsahuje náhodná data. Odstraním je.
FD_ZERO(&myset);
- // Zaplnění množiny sokety
FD_SET(mySocket, &myset);
- // Vyplním časový údaj (například na 3 minuty)
- tv.tv_sec = 2;// Počet sekund
- tv.tv_usec = 0;// Počet mikrosekund
+
+ tv.tv_sec = 2;
+ tv.tv_usec = 0;
srv.sin_family = AF_INET;
srv.sin_port = htons (server->port);
@@ -200,7 +201,6 @@ int server_getinfo (server_t *server)
return -1;
}
- // Zavolám select (V Linuxu musím mít nastavenou proměnnou max.)
int ret = select (mySocket+1, NULL, &myset, NULL, &tv);
if (ret == -1)
@@ -251,6 +251,7 @@ int server_getinfo (server_t *server)
#endif
/*
+ ["name: F\n"] >= svn82
"version: svnX\n"
"clients: N\n"
"maxclients: M\n"
@@ -278,42 +279,75 @@ int server_getinfo (server_t *server)
i ++;
}
- unsigned len = strlen (str);
- if (!strncmp (str, "version: ", 9)) {
- unsigned ver_len = strlen (str+9);
- server->version = (char *) malloc (sizeof (char) * (ver_len + 1));
-
+ unsigned name = 0;
+
+ if (strstr (str, "name: "))
+ name = 1;
+
+ int len = 0;
+
+ if (name) {
+ len = strlen (str);
+ if (!strncmp (str, "name: ", 6)) {
+ unsigned name_len = strlen (str+6);
+ server->name = (char *) malloc (sizeof (char) * (name_len + 2));
+
+ if (!server->name)
+ return 0;
+
+ memcpy (server->name, str+6, name_len+1);
+ server->name[name_len+1] = '\0';
+ }
+ }
+
+ /* HACK */
+ if (!name)
+ len = -1;
+
+ if (!strncmp (str+len+1, "version: ", 9)) {
+ unsigned ver_len = strlen (str+len+10);
+ server->version = (char *) malloc (sizeof (char) * (ver_len + 2));
+
if (!server->version)
return 0;
-
- memcpy (server->version, str+9, ver_len+1);
+
+ memcpy (server->version, str+len+10, ver_len+1);
+ server->version[ver_len+1] = '\0';
}
+ len += strlen (str+len+1) + 1;
+
+
if (!strncmp (str+len+1, "clients: ", 9))
server->clients = atoi (str+len+10);
len += strlen (str+len+1) + 1;
+
if (!strncmp (str+len+1, "maxclients: ", 12))
server->maxclients = atoi (str+len+13);
len += strlen (str+len+1) + 1;
+
if (!strncmp (str+len+1, "uptime: ", 8))
server->uptime = atoi (str+len+9);
len += strlen (str+len+1) + 1;
+
if (!strncmp (str+len+1, "arena: ", 7)) {
- unsigned arena_len = strlen (str+9);
- server->arena = (char *) malloc (sizeof (char) * (arena_len + 1));
-
+ unsigned arena_len = strlen (str+len+9);
+ server->arena = (char *) malloc (sizeof (char) * (arena_len + 2));
+
if (!server->arena)
return 0;
-
+
memcpy (server->arena, str+len+8, arena_len+1);
+ server->arena[arena_len+1] = '\0';
}
+
free (str);
server->state = 1;
@@ -332,8 +366,8 @@ static int LoadServers ()
struct sockaddr_in server;
server.sin_family = AF_INET;
- server.sin_port = htons (MASTER_PORT);
- server.sin_addr.s_addr = inet_addr (MASTER_SERVER);
+ server.sin_port = htons (NET_MASTER_PORT);
+ server.sin_addr.s_addr = inet_addr (NET_MASTER_SERVER);
if ((s = socket (AF_INET, SOCK_STREAM, 0)) < 0) {
close (s);
@@ -385,11 +419,7 @@ static int LoadServers ()
if (ret == 0)
return -2;
- /* receive server list if exist */
- //int len;
- //do {
int len = recv (s, buf, 1024, 0);
- //} while (len < 1);
close (s);
#else
@@ -419,14 +449,17 @@ static int LoadServers ()
ctx->ip = header->ip;
ctx->port = header->port;
+ ctx->name = 0;
+ ctx->version = 0;
+ ctx->arena = 0;
srv.sin_addr.s_addr = ctx->ip;
int ret = server_getinfo (ctx);
if (ret == 1) {
- sprintf (list, "%s:%d (%s) - %s - %d/%d - %dms", inet_ntoa (srv.sin_addr), ctx->port, ctx->version,
- ctx->arena, ctx->clients, ctx->maxclients, ctx->ping);
+ sprintf (list, "%s (%s) - %s:%d - %s - %d/%d - %dms", ctx->name ? ctx->name : "Unknown", ctx->version, inet_ntoa (srv.sin_addr), ctx->port,
+ ctx->arena ? ctx->arena : "Unknown", ctx->clients, ctx->maxclients, ctx->ping);
} else if (ret == -2)
sprintf (list, "%s:%d - Timeout", inet_ntoa (srv.sin_addr), ctx->port);
else
diff --git a/src/screen/screen_browser.h b/src/screen/screen_browser.h
index a3f88e7..88e1ca6 100644
--- a/src/screen/screen_browser.h
+++ b/src/screen/screen_browser.h
@@ -3,9 +3,6 @@
#define SCREEN_BROWSER_H
-#define MASTER_SERVER "193.85.244.165"
-#define MASTER_PORT 2200
-
typedef struct server_context {
struct server_context *next, *prev;
diff --git a/src/server/publicServer.c b/src/server/publicServer.c
index 0bd88ac..4a97b82 100644
--- a/src/server/publicServer.c
+++ b/src/server/publicServer.c
@@ -6,6 +6,14 @@
#include <signal.h>
#include <time.h>
+#ifdef SUPPORT_NET_UNIX_UDP
+#include <sys/socket.h>
+#include <arpa/inet.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+#endif
+
#include "base/main.h"
#include "base/list.h"
#include "base/tux.h"
@@ -27,6 +35,12 @@ static int arenaId;
static arena_t *arena;
static bool_t isSignalEnd;
+#ifdef SUPPORT_NET_UNIX_UDP
+extern int errno;
+
+#define __PACKED__ __attribute__ ((__packed__))
+#endif
+
void countRoundInc()
{
}
@@ -36,6 +50,96 @@ static char *getSetting(char *env, char *param, char *default_val)
return getParamElse(param, getServerConfigFileValue(env, default_val) );
}
+static int registerPublicServer()
+{
+ int s;
+
+ /* TODO: dodelat TCP makro */
+#ifdef SUPPORT_NET_UNIX_UDP
+ struct sockaddr_in server;
+
+ server.sin_family = AF_INET;
+ server.sin_port = htons (NET_MASTER_PORT);
+ server.sin_addr.s_addr = inet_addr (NET_MASTER_SERVER);
+
+ if ((s = socket (AF_INET, SOCK_STREAM, 0)) < 0) {
+ close (s);
+ return 0;
+ }
+
+ int oldFlag = fcntl (s, F_GETFL, 0);
+ if (fcntl (s, F_SETFL, oldFlag | O_NONBLOCK) == -1) {
+ return -1;
+ }
+
+ if (connect (s, (struct sockaddr *) &server, sizeof (server)) == -1) {
+ if (errno != EINPROGRESS)
+ return -1;
+ }
+
+ struct timeval tv;
+
+ fd_set myset;
+
+ FD_ZERO(&myset);
+ FD_SET(s, &myset);
+
+ tv.tv_sec = 3;
+ tv.tv_usec = 0;
+
+ int ret = select (s+1, NULL, &myset, NULL, &tv);
+
+ if (ret == -1)
+ return -1;
+
+ if (ret == 0)
+ return -1;
+
+ FD_ZERO(&myset);
+ FD_SET(s, &myset);
+
+ tv.tv_sec = 1;
+ tv.tv_usec = 0;
+
+ ret = select (s+1, NULL, &myset, NULL, &tv);
+
+ if (ret == -1)
+ return -1;
+
+ if (ret == 0)
+ return -1;
+
+
+ typedef struct {
+ unsigned char cmd;
+ unsigned port;
+ unsigned ip;
+ } __PACKED__ register_head;
+
+ char *str = (char *) malloc (sizeof (register_head));
+
+ register_head *head = (register_head *) str;
+
+ head->cmd = 'p';
+ head->port = atoi( getSetting("PORTv4", "--port", "2200") );
+ head->ip = 0; // TODO
+
+ /* send request for server list */
+ int r = send (s, str, 9, 0);
+
+ if (r == -1) {
+ close(s);
+ return -1;
+ }
+
+ close(s);
+#else
+ return -1;
+#endif
+
+ return 0;
+}
+
static int initPublicServerNetwork()
{
char ip4[STR_IP_SIZE];
@@ -102,6 +206,11 @@ int initPublicServer()
setServerMaxClients( atoi( getSetting("MAX_CLIENTS", "--maxclients", "32") ));
+ if (registerPublicServer() < 0)
+ {
+ printf("Nemuzu kontaktovat master server !\n");
+ }
+
return 0;
}