From 38b98c9ecd0c300d40ae6db05ab9dc2b9189df8d Mon Sep 17 00:00:00 2001 From: oroborus Date: Tue, 1 Jul 2008 17:53:41 +0000 Subject: - oprava chyby pri teleportacii lasserov - skutocne opravena chybya s neinicializovany audiom, a strielanim pri chodeni - ZeXxove patche pre spojenie s master serverom - client zobrazuje hlasku ak sa nepodarilo spojit zo serverom alebo sppojenie nasilne ukoncilo git-svn-id: http://opensvn.csie.org/tuxanci_ng@81 0ee4d065-81f0-4d1e-b06c-ff20ad07cc3e --- src/screen/screen_browser.c | 156 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 121 insertions(+), 35 deletions(-) (limited to 'src/screen/screen_browser.c') 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 #include #include +#include #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); -- cgit v1.2.3