diff options
Diffstat (limited to 'src/screen')
| -rw-r--r-- | src/screen/screen_browser.c | 156 | ||||
| -rw-r--r-- | src/screen/screen_world.c | 26 |
2 files changed, 134 insertions, 48 deletions
diff --git a/src/screen/screen_browser.c b/src/screen/screen_browser.c index 602881f..3307423 100644 --- a/src/screen/screen_browser.c +++ b/src/screen/screen_browser.c @@ -22,8 +22,11 @@ #include <netdb.h> #include <unistd.h> #include <fcntl.h> +#include <errno.h> #include "net_unix/udp.h" + +extern int errno; #endif #ifndef NO_SOUND @@ -165,55 +168,94 @@ int server_getinfo (server_t *server) { #ifdef SUPPORT_NET_UNIX_UDP struct sockaddr_in srv; + int mySocket; + + if ((mySocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1) { + return -1; + } + + // Lets make socket non-blocking + int oldFlag = fcntl (mySocket, F_GETFL, 0); + if (fcntl (mySocket, F_SETFL, oldFlag | O_NONBLOCK) == -1) { + return -1; + } + + 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 + + srv.sin_family = AF_INET; + srv.sin_port = htons (server->port); srv.sin_addr.s_addr = server->ip; - sock_udp_t *sock = connectUdpSocket(inet_ntoa (srv.sin_addr), server->port, PROTO_UDPv4); + if (connect (mySocket, (struct sockaddr *) &srv, sizeof (srv)) == -1) { + if (errno != EINPROGRESS) + 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) + return 0; + + if (ret == 0) + return -2; char request[8]; memcpy (request, "status\n", 7); - writeUdpSocket(sock, sock, request, 7); + int r = send (mySocket, request, 7, 0); + + if (r == -1) + return -2; + + FD_ZERO(&myset); + FD_SET(mySocket, &myset); + tv.tv_sec = 1; + tv.tv_usec = 0; char *str = (char *) malloc (sizeof (char) * 257); - // Lets make socket non-blocking - int oldFlag = fcntl (sock->sock, F_GETFL, 0); - if (fcntl (sock->sock, F_SETFL, oldFlag | O_NONBLOCK) == -1) { + if (!str) return -1; - } -#else - return 0; -#endif - /* 500ms timeout */ - unsigned timeout = SERVER_TIMEOUT; - int ret = 0; - while (timeout) { - usleep (1); -#ifdef SUPPORT_NET_UNIX_UDP - ret = readUdpSocket(sock, sock, str, 256); -#endif + while (1) { + int sel = select (mySocket + 1, &myset, NULL, NULL, &tv); + + if (sel == 0) + return -2; + + if (sel == -1) + return -2; + + if ((ret = recv(mySocket, str, 256, 0)) == -1) + return -1; + if (ret > 0) break; - - timeout --; } - /* server not respond */ - if (timeout < 1) { - free (str); - server->state = 0; - return 0; - } + close (mySocket); - server->ping = SERVER_TIMEOUT - timeout; + server->ping = 1000 - (tv.tv_usec/1000); +#else + return 0; +#endif -/* - "version: svnX\n" - "clients: N\n" - "maxclients: M\n" - "uptime: D\n" -*/ + /* + "version: svnX\n" + "clients: N\n" + "maxclients: M\n" + "uptime: D\n" + */ typedef struct { char *version; @@ -298,14 +340,56 @@ static int LoadServers () return 0; } - if (connect (s, (struct sockaddr *) &server, sizeof (server)) == -1) + 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; + // Množina + fd_set myset; + // Množina obsahuje náhodná data. Odstraním je. + FD_ZERO(&myset); + // Zaplnění množiny sokety + FD_SET(s, &myset); + // Vyplním časový údaj (například na 3 minuty) + tv.tv_sec = 3;// Počet sekund + tv.tv_usec = 0;// Počet mikrosekund + // Zavolám select (V Linuxu musím mít nastavenou proměnnou max.) + int ret = select (s+1, NULL, &myset, NULL, &tv); + + if (ret == -1) return 0; + if (ret == 0) + return -2; + /* send request for server list */ send (s, "l", 1, 0); + // Množina obsahuje náhodná data. Odstraním je. + FD_ZERO(&myset); + // Zaplnění množiny sokety + FD_SET(s, &myset); + + ret = select (s+1, &myset, NULL, NULL, &tv); + + if (ret == -1) + return 0; + + 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 @@ -340,10 +424,12 @@ static int LoadServers () int ret = server_getinfo (ctx); - if (ret) { + 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); - } else + } else if (ret == -2) + sprintf (list, "%s:%d - Timeout", inet_ntoa (srv.sin_addr), ctx->port); + else sprintf (list, "%s:%d - Offline", inet_ntoa (srv.sin_addr), ctx->port); addToWidgetSelect(select_server, list); diff --git a/src/screen/screen_world.c b/src/screen/screen_world.c index 296c31f..3c656f5 100644 --- a/src/screen/screen_world.c +++ b/src/screen/screen_world.c @@ -230,6 +230,13 @@ static void control_keyboard_right(tux_t *tux) if( mapa[(SDLKey)getKey(KEY_TUX_RIGHT_MOVE_LEFT)] == SDL_PRESSED )countKey++; if( mapa[(SDLKey)getKey(KEY_TUX_RIGHT_MOVE_DOWN)] == SDL_PRESSED )countKey++; + if( mapa[(SDLKey)getKey(KEY_TUX_RIGHT_SHOOT)] == SDL_PRESSED && tux->isCanShot == TRUE ) + { + netAction(tux, TUX_SHOT); + actionTux(tux, TUX_SHOT); + return; + } + if( mapa[(SDLKey)getKey(KEY_TUX_RIGHT_MOVE_UP)] == SDL_PRESSED ) { if(countKey > 1 && lastKey == getKey(KEY_TUX_RIGHT_MOVE_UP) )goto tuUp; @@ -279,13 +286,6 @@ static void control_keyboard_right(tux_t *tux) tuDown:; } - if( mapa[(SDLKey)getKey(KEY_TUX_RIGHT_SHOOT)] == SDL_PRESSED && tux->isCanShot == TRUE ) - { - netAction(tux, TUX_SHOT); - actionTux(tux, TUX_SHOT); - return; - } - if( mapa[(SDLKey)getKey(KEY_TUX_RIGHT_SWITCH_WEAPON)] == SDL_PRESSED ) { if( tux->isCanSwitchGun == TRUE ) @@ -314,6 +314,12 @@ static void control_keyboard_left(tux_t *tux) if( mapa[(SDLKey)getKey(KEY_TUX_LEFT_MOVE_LEFT)] == SDL_PRESSED )countKey++; if( mapa[(SDLKey)getKey(KEY_TUX_LEFT_MOVE_DOWN)] == SDL_PRESSED )countKey++; + if( mapa[(SDLKey)getKey(KEY_TUX_LEFT_SHOOT)] == SDL_PRESSED && tux->isCanShot == TRUE ) + { + actionTux(tux, TUX_SHOT); + return; + } + if( mapa[(SDLKey)getKey(KEY_TUX_LEFT_MOVE_UP)] == SDL_PRESSED ) { if(countKey > 1 && lastKey == getKey(KEY_TUX_LEFT_MOVE_UP) )goto tuUp; @@ -359,12 +365,6 @@ static void control_keyboard_left(tux_t *tux) tuDown:; } - if( mapa[(SDLKey)getKey(KEY_TUX_LEFT_SHOOT)] == SDL_PRESSED && tux->isCanShot == TRUE ) - { - actionTux(tux, TUX_SHOT); - return; - } - if( mapa[(SDLKey)getKey(KEY_TUX_LEFT_SWITCH_WEAPON)] == SDL_PRESSED ) { if( tux->isCanSwitchGun == TRUE ) |