summaryrefslogtreecommitdiff
path: root/src/client.c
diff options
context:
space:
mode:
authororoborus <oroborus@0ee4d065-81f0-4d1e-b06c-ff20ad07cc3e>2008-03-17 20:29:34 +0000
committeroroborus <oroborus@0ee4d065-81f0-4d1e-b06c-ff20ad07cc3e>2008-03-17 20:29:34 +0000
commit437da38a26548714e6e1640722148f0f9f601ccb (patch)
tree3bc6a5a0903211e2d1ffa4fd9b3e6e467d413ecf /src/client.c
parent51aae47ae08ad61507f219c24ed6d9321c866f45 (diff)
<Oroborus> - opravena chyba, clent nacital iba _jeden_ sietovy packet za 50 ms ( ano aj ked ich prislo viacej)
<Oroborus> - server pinguje clientov a na zaklade toho client vie, ci server nespadol <Oroborus> - publicserver sa da korektne vypnut signalom SIGQUIT <Oroborus> - publicserver bol pretiahnuty cez valgrind, teraz za pocet volani funkcie malloc rovna poctu volani funkcie free <Oroborus> - v sietovom multiplayeri sa da chodit cez teleporty a strielat do teleportov <Oroborus> - do rur sa da siez strielat git-svn-id: http://opensvn.csie.org/tuxanci_ng@24 0ee4d065-81f0-4d1e-b06c-ff20ad07cc3e
Diffstat (limited to 'src/client.c')
-rw-r--r--src/client.c156
1 files changed, 107 insertions, 49 deletions
diff --git a/src/client.c b/src/client.c
index a238373..9dfeda5 100644
--- a/src/client.c
+++ b/src/client.c
@@ -31,11 +31,13 @@ static sock_sdl_udp_t *sock_server_sdl_udp;
static buffer_t *clientBuffer;
static my_time_t lastPing;
+static my_time_t lastPingServerAlive;
static void initClient()
{
clientBuffer = newBuffer( LIMIT_BUFFER );
lastPing = getMyTime();
+ lastPingServerAlive = getMyTime();
proto_send_hello_client();
}
@@ -110,15 +112,6 @@ void sendServer(char *msg)
#ifdef SUPPORT_NET_UNIX_TCP
ret = writeTcpSocket(sock_server_tcp, msg, strlen(msg));
-#endif
-
-#ifdef SUPPORT_NET_UNIX_UDP
- ret = writeUdpSocket(sock_server_udp, sock_server_udp, msg, strlen(msg));
-#endif
-
-#ifdef SUPPORT_NET_SDL_UDP
- ret = writeSdlUdpSocket(sock_server_sdl_udp, sock_server_sdl_udp, msg, strlen(msg));
-#endif
if ( ret == 0 )
{
@@ -131,9 +124,18 @@ void sendServer(char *msg)
fprintf(stderr, "nastala chyba pri poslani spravy serveru\n");
setWorldEnd();
}
+#endif
+
+#ifdef SUPPORT_NET_UNIX_UDP
+ ret = writeUdpSocket(sock_server_udp, sock_server_udp, msg, strlen(msg));
+#endif
+
+#ifdef SUPPORT_NET_SDL_UDP
+ ret = writeSdlUdpSocket(sock_server_sdl_udp, sock_server_sdl_udp, msg, strlen(msg));
+#endif
}
-static void eventServerSelect()
+static int eventServerSelect()
{
char buffer[STR_SIZE];
int ret;
@@ -142,6 +144,20 @@ static void eventServerSelect()
#ifdef SUPPORT_NET_UNIX_TCP
ret = readTcpSocket(sock_server_tcp, buffer, STR_SIZE-1);
+
+ if( ret == 0 )
+ {
+ fprintf(stderr, "server uzatovril sietovy socket\n");
+ setWorldEnd();
+ return ret;
+ }
+
+ if( ret < 0 )
+ {
+ fprintf(stderr, "chyba, spojenie prerusene \n");
+ setWorldEnd();
+ return ret;
+ }
#endif
#ifdef SUPPORT_NET_UNIX_UDP
@@ -153,30 +169,18 @@ static void eventServerSelect()
if( ret < 0 )
{
- return;
+ return ret;
}
#endif
- if( ret == 0 )
- {
- fprintf(stderr, "server uzatovril sietovy socket\n");
- setWorldEnd();
- return;
- }
-
- if( ret < 0 )
- {
- fprintf(stderr, "chyba, spojenie prerusene \n");
- setWorldEnd();
- return;
- }
-
if( addBuffer(clientBuffer, buffer, ret) != 0 )
{
fprintf(stderr, "chyba, nemozem zapisovat do mojho buffera !\n");
setWorldEnd();
- return;
+ return ret;
}
+
+ return ret;
}
void eventServerBuffer()
@@ -189,15 +193,17 @@ void eventServerBuffer()
while ( getBufferLine(clientBuffer, line, STR_SIZE) >= 0 )
{
- printf("spracuvavam %s", line);
+ //printf("spracuvavam %s", line);
if( strncmp(line, "init", 4) == 0 )proto_recv_init_client(line);
if( strncmp(line, "event", 5) == 0 )proto_recv_event_client(line);
if( strncmp(line, "newtux", 6) == 0 )proto_recv_newtux_client(line);
if( strncmp(line, "deltux", 6) == 0 )proto_recv_deltux_client(line);
if( strncmp(line, "additem", 7) == 0 )proto_recv_additem_client(line);
+ if( strncmp(line, "shot", 4) == 0 )proto_recv_shot_client(line);
if( strncmp(line, "kill", 4) == 0 )proto_recv_kill_client(line);
if( strncmp(line, "score", 5) == 0 )proto_recv_score_client(line);
+ if( strncmp(line, "ping", 4) == 0 )proto_recv_ping_client(line);
if( strncmp(line, "end", 3) == 0 )proto_recv_end_client(line);
}
}
@@ -209,20 +215,27 @@ void selectClientTcpSocket()
fd_set readfds;
struct timeval tv;
int max_fd;
+ bool_t isNext;
- tv.tv_sec = 0;
- tv.tv_usec = 0;
-
- FD_ZERO(&readfds);
- FD_SET(sock_server_tcp->sock, &readfds);
- max_fd = sock_server_tcp->sock;
+ do{
+ isNext = FALSE;
- select(max_fd+1, &readfds, (fd_set *)NULL, (fd_set *)NULL, &tv);
+ tv.tv_sec = 0;
+ tv.tv_usec = 0;
+
+ FD_ZERO(&readfds);
+ FD_SET(sock_server_tcp->sock, &readfds);
+ max_fd = sock_server_tcp->sock;
+
+ select(max_fd+1, &readfds, (fd_set *)NULL, (fd_set *)NULL, &tv);
+
+ if( FD_ISSET(sock_server_tcp->sock, &readfds) )
+ {
+ eventServerSelect();
+ isNext = TRUE;
+ }
- if( FD_ISSET(sock_server_tcp->sock, &readfds) )
- {
- eventServerSelect();
- }
+ }while( isNext == TRUE );
}
#endif
@@ -242,6 +255,25 @@ void eventPingServer()
}
}
+void refreshPingServerAlive()
+{
+ lastPingServerAlive = getMyTime();
+}
+
+bool_t isServerAlive()
+{
+ my_time_t currentTime;
+
+ currentTime = getMyTime();
+
+ if( currentTime - lastPingServerAlive > SERVER_TIMEOUT_ALIVE )
+ {
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
#endif
#ifdef SUPPORT_NET_UNIX_UDP
@@ -251,20 +283,35 @@ void selectClientUdpSocket()
fd_set readfds;
struct timeval tv;
int max_fd;
+ bool_t isNext;
+
+ if( isServerAlive() == FALSE )
+ {
+ fprintf(stderr, "server neodpoveda !\n");
+ setWorldEnd();
+ return;
+ }
+
+ do{
+ isNext = FALSE;
- tv.tv_sec = 0;
- tv.tv_usec = 0;
+ tv.tv_sec = 0;
+ tv.tv_usec = 0;
+
+ FD_ZERO(&readfds);
+ FD_SET(sock_server_udp->sock, &readfds);
+ max_fd = sock_server_udp->sock;
- FD_ZERO(&readfds);
- FD_SET(sock_server_udp->sock, &readfds);
- max_fd = sock_server_udp->sock;
+ select(max_fd+1, &readfds, (fd_set *)NULL, (fd_set *)NULL, &tv);
+
+ if( FD_ISSET(sock_server_udp->sock, &readfds) )
+ {
+ eventServerSelect();
+ isNext = TRUE;
+ }
- select(max_fd+1, &readfds, (fd_set *)NULL, (fd_set *)NULL, &tv);
+ }while( isNext == TRUE );
- if( FD_ISSET(sock_server_udp->sock, &readfds) )
- {
- eventServerSelect();
- }
}
#endif
@@ -273,7 +320,18 @@ void selectClientUdpSocket()
void selectClientSdlUdpSocket()
{
- eventServerSelect();
+ int ret;
+
+ if( isServerAlive() == FALSE )
+ {
+ fprintf(stderr, "server neodpoveda !\n");
+ setWorldEnd();
+ return;
+ }
+
+ do{
+ ret = eventServerSelect();
+ }while( ret > 0);
}
#endif