diff options
| author | tomas <tomas@0ee4d065-81f0-4d1e-b06c-ff20ad07cc3e> | 2008-07-01 22:18:59 +0000 |
|---|---|---|
| committer | tomas <tomas@0ee4d065-81f0-4d1e-b06c-ff20ad07cc3e> | 2008-07-01 22:18:59 +0000 |
| commit | d46666420ff797807fb5447c44d4776a74b34726 (patch) | |
| tree | f0739af8dd6e07b04315aece2ce10fde6da0e0e9 /src | |
| parent | 7a41e2f1d440f521660a251125cd064490164f60 (diff) | |
- server browser podporuje novou verzi protokolu, navic je zpetne kompatibilni
- server browser nyni ukazuje nazev kazdeho serveru
- makro NET_MASTER_SERVER a NET_MASTER_PORT byly presunuty do src/base/net_multiplayer.h
- publicserver se sam zaregistruje do master serveru
git-svn-id: http://opensvn.csie.org/tuxanci_ng@83 0ee4d065-81f0-4d1e-b06c-ff20ad07cc3e
Diffstat (limited to 'src')
| -rw-r--r-- | src/base/net_multiplayer.h | 3 | ||||
| -rw-r--r-- | src/base/storage.c | 2 | ||||
| -rw-r--r-- | src/screen/screen_browser.c | 93 | ||||
| -rw-r--r-- | src/screen/screen_browser.h | 3 | ||||
| -rw-r--r-- | src/server/publicServer.c | 109 |
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; } |