summaryrefslogtreecommitdiff
path: root/src/client.c
diff options
context:
space:
mode:
authororoborus <oroborus@0ee4d065-81f0-4d1e-b06c-ff20ad07cc3e>2008-03-14 19:31:47 +0000
committeroroborus <oroborus@0ee4d065-81f0-4d1e-b06c-ff20ad07cc3e>2008-03-14 19:31:47 +0000
commit593ac1e25c2053f06cb1b7e29785a695d3c57ad3 (patch)
tree15f6bb50abedc884122d40b98349e35d702b7729 /src/client.c
parenta4e34c257a4f5966ce699f48d30b3528bdaa45e4 (diff)
- podpora UDP
git-svn-id: http://opensvn.csie.org/tuxanci_ng@15 0ee4d065-81f0-4d1e-b06c-ff20ad07cc3e
Diffstat (limited to 'src/client.c')
-rw-r--r--src/client.c133
1 files changed, 104 insertions, 29 deletions
diff --git a/src/client.c b/src/client.c
index a885b65..530c0f3 100644
--- a/src/client.c
+++ b/src/client.c
@@ -1,4 +1,8 @@
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+
#include "list.h"
#include "tux.h"
#include "network.h"
@@ -15,6 +19,12 @@ static sock_tcp_t *sock_server_tcp;
static sock_udp_t *sock_server_udp;
static buffer_t *clientBuffer;
+static void initClient()
+{
+ clientBuffer = newBuffer( LIMIT_BUFFER );
+ proto_send_hello_client();
+}
+
int initTcpClient(char *ip, int port)
{
sock_server_tcp = connectTcpSocket(ip, port);
@@ -25,7 +35,24 @@ int initTcpClient(char *ip, int port)
}
printf("connect %s %d\n", ip, port);
- clientBuffer = newBuffer( LIMIT_BUFFER );
+ protocolType = NET_PROTOCOL_TYPE_TCP;
+ initClient();
+
+ return 0;
+}
+
+int initUdpClient(char *ip, int port)
+{
+ sock_server_udp = connectUdpSocket(ip, port);
+
+ if( sock_server_udp == NULL )
+ {
+ return -1;
+ }
+
+ printf("connect %s %d\n", ip, port);
+ protocolType = NET_PROTOCOL_TYPE_UDP;
+ initClient();
return 0;
}
@@ -34,29 +61,32 @@ void sendServer(char *msg)
{
int ret;
+ assert( msg != NULL );
+
if( protocolType == NET_PROTOCOL_TYPE_TCP )
{
ret = writeTcpSocket(sock_server_tcp, msg, strlen(msg));
-
- if ( ret == 0 )
- {
- fprintf(stderr, "server uzatvoril sietovy socket\n");
- setWorldEnd();
- }
-
- if ( ret < 0 )
- {
- fprintf(stderr, "nastala chyba pri poslani spravy serveru\n");
- setWorldEnd();
- }
}
if( protocolType == NET_PROTOCOL_TYPE_UDP )
{
+ ret = writeUdpSocket(sock_server_udp, sock_server_udp, msg, strlen(msg));
+ }
+
+ if ( ret == 0 )
+ {
+ fprintf(stderr, "server uzatvoril sietovy socket\n");
+ setWorldEnd();
+ }
+
+ if ( ret < 0 )
+ {
+ fprintf(stderr, "nastala chyba pri poslani spravy serveru\n");
+ setWorldEnd();
}
}
-static void eventServerTcpSelect()
+static void eventServerSelect()
{
char buffer[STR_SIZE];
int ret;
@@ -67,23 +97,25 @@ static void eventServerTcpSelect()
{
ret = readTcpSocket(sock_server_tcp, buffer, STR_SIZE-1);
- if( ret == 0 )
- {
- fprintf(stderr, "server uzatovril sietovy socket\n");
- setWorldEnd();
- return;
- }
-
- if( ret < 0 )
- {
- fprintf(stderr, "chyba, spojenie prerusene \n");
- setWorldEnd();
- return;
- }
}
if( protocolType == NET_PROTOCOL_TYPE_UDP )
{
+ ret = readUdpSocket(sock_server_udp, sock_server_udp, buffer, STR_SIZE-1);
+ }
+
+ 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 )
@@ -100,6 +132,8 @@ void eventServerBuffer()
/* obsluha udalosti od servera */
+ assert( clientBuffer != NULL );
+
while ( getBufferLine(clientBuffer, line, STR_SIZE) >= 0 )
{
//printf("dostal som %s", line);
@@ -109,6 +143,7 @@ void eventServerBuffer()
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, "end", 3) == 0 )proto_recv_end_client(line);
}
}
@@ -129,14 +164,54 @@ void selectClientTcpSocket()
if( FD_ISSET(sock_server_tcp->sock, &readfds) )
{
- eventServerTcpSelect(sock_server_tcp);
+ eventServerSelect();
+ }
+}
+
+void selectClientUdpSocket()
+{
+ fd_set readfds;
+ struct timeval tv;
+ int max_fd;
+
+ tv.tv_sec = 0;
+ tv.tv_usec = 0;
+
+ 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();
}
}
+static void quitClient()
+{
+ proto_send_end_client();
+ assert( clientBuffer != NULL );
+ destroyBuffer(clientBuffer);
+}
+
void quitTcpClient()
{
+ quitClient();
+
+ assert( sock_server_tcp != NULL );
closeTcpSocket(sock_server_tcp);
- destroyBuffer(clientBuffer);
+
printf("quit conenct\n");
}
+void quitUdpClient()
+{
+ quitClient();
+
+ assert( sock_server_udp != NULL );
+ closeUdpSocket(sock_server_udp);
+
+ printf("quit conenct\n");
+}