summaryrefslogtreecommitdiff
path: root/src/screen/screen_browser.c
diff options
context:
space:
mode:
authororoborus <oroborus@0ee4d065-81f0-4d1e-b06c-ff20ad07cc3e>2008-07-01 17:53:41 +0000
committeroroborus <oroborus@0ee4d065-81f0-4d1e-b06c-ff20ad07cc3e>2008-07-01 17:53:41 +0000
commit38b98c9ecd0c300d40ae6db05ab9dc2b9189df8d (patch)
tree2c13c890e75f95c778f4ed8c9933a3852cac2907 /src/screen/screen_browser.c
parent62cdf2b04aa8d0162da8e024d9901ba5743bf5e3 (diff)
- 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
Diffstat (limited to 'src/screen/screen_browser.c')
-rw-r--r--src/screen/screen_browser.c156
1 files changed, 121 insertions, 35 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);