diff options
| author | oroborus <oroborus@0ee4d065-81f0-4d1e-b06c-ff20ad07cc3e> | 2008-03-14 19:31:47 +0000 |
|---|---|---|
| committer | oroborus <oroborus@0ee4d065-81f0-4d1e-b06c-ff20ad07cc3e> | 2008-03-14 19:31:47 +0000 |
| commit | 593ac1e25c2053f06cb1b7e29785a695d3c57ad3 (patch) | |
| tree | 15f6bb50abedc884122d40b98349e35d702b7729 /src/client.c | |
| parent | a4e34c257a4f5966ce699f48d30b3528bdaa45e4 (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.c | 133 |
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"); +} |