From e26f3f1e43d8a8f19eef82308184894afa406e10 Mon Sep 17 00:00:00 2001 From: oroborus Date: Tue, 5 Aug 2008 21:17:31 +0000 Subject: - dropne upravy, snad dom tam nic nepokail -- aj sa naplni buffer (4096 bajtov) server clienta odstreli. - medzi tym som pozeral/pozeram Svedsku trojku na JoJ-ke :) git-svn-id: http://opensvn.csie.org/tuxanci_ng@191 0ee4d065-81f0-4d1e-b06c-ff20ad07cc3e --- src/base/buffer.c | 2 +- src/base/server.c | 3 +-- src/base/serverSelect.c | 36 ++++++++++++++++++++++++++++++------ src/base/serverSelect.h | 5 ++++- src/base/tcp_server.c | 32 ++++++++++++++++++++++---------- src/base/udp_server.c | 8 ++++---- src/client/client.c | 32 ++++++++++++++++++++++++-------- 7 files changed, 86 insertions(+), 32 deletions(-) (limited to 'src') diff --git a/src/base/buffer.c b/src/base/buffer.c index f3ec070..263037b 100755 --- a/src/base/buffer.c +++ b/src/base/buffer.c @@ -39,7 +39,7 @@ int addBuffer(buffer_t *p, char *data, int len) { memcpy(p->data + p->size, data, len); p->size += len; - return 0; + return len; } return -1; diff --git a/src/base/server.c b/src/base/server.c index a0bfb60..7759b74 100644 --- a/src/base/server.c +++ b/src/base/server.c @@ -318,8 +318,7 @@ void sendClient(client_t *p, char *msg) break; case CLIENT_TYPE_TCP : //ret = writeTcpSocket(p->socket_tcp, msg, strlen(msg)); - addBuffer(p->sendBuffer, msg, strlen(msg)); - ret = 1; + ret = addBuffer(p->sendBuffer, msg, strlen(msg)); break; default : assert( ! "zly typ !"); diff --git a/src/base/serverSelect.c b/src/base/serverSelect.c index 99505d5..32be485 100644 --- a/src/base/serverSelect.c +++ b/src/base/serverSelect.c @@ -22,6 +22,7 @@ static struct timeval tv; static fd_set readfds; +static fd_set writefds; static int max_fd; void restartSelect() @@ -40,9 +41,9 @@ void restartSelect() max_fd = 0; } -void addSockToSelect(int sock) +void addSockToSelectRead(int sock) { - //printf("addSockToSelect %d\n", sock); + //printf("addSockToSelectRead %d\n", sock); FD_SET(sock, &readfds); @@ -52,6 +53,18 @@ void addSockToSelect(int sock) } } +void addSockToSelectWrite(int sock) +{ + //printf("addSockToSelectWrite %d\n", sock); + + FD_SET(sock, &writefds); + + if(sock > max_fd ) + { + max_fd = sock; + } +} + int actionSelect() { int ret; @@ -62,23 +75,23 @@ int actionSelect() if( listClient->count == 0 ) { - ret = select(max_fd+1, &readfds, (fd_set *)NULL, (fd_set *)NULL, NULL); + ret = select(max_fd+1, &readfds, &writefds, (fd_set *)NULL, NULL); setServerTimer(); } else { - ret = select(max_fd+1, &readfds, (fd_set *)NULL, (fd_set *)NULL, &tv); + ret = select(max_fd+1, &readfds, &writefds, (fd_set *)NULL, &tv); } #endif #ifndef PUBLIC_SERVER - ret = select(max_fd+1, &readfds, (fd_set *)NULL, (fd_set *)NULL, &tv); + ret = select(max_fd+1, &readfds, &writefds, (fd_set *)NULL, &tv); #endif return ret; } -int isChangeSockInSelect(int sock) +int isChangeSockInSelectRead(int sock) { int ret; @@ -88,3 +101,14 @@ int isChangeSockInSelect(int sock) return ret; } + +int isChangeSockInSelectWrite(int sock) +{ + int ret; + + ret = FD_ISSET(sock, &writefds); + + //printf("isChangeSockInSelect %d -> %d\n", sock, ret); + + return ret; +} diff --git a/src/base/serverSelect.h b/src/base/serverSelect.h index 332a4da..5873956 100644 --- a/src/base/serverSelect.h +++ b/src/base/serverSelect.h @@ -4,8 +4,11 @@ #define SERVER_SELECT extern void restartSelect(); -extern void addSockToSelect(int sock); +extern void addSockToSelectRead(int sock); +extern void addSockToSelectWrite(int sock); extern int actionSelect(); extern int isChangeSockInSelect(int sock); +extern int isChangeSockInSelectRead(int sock); +extern int isChangeSockInSelectWrite(int sock); #endif diff --git a/src/base/tcp_server.c b/src/base/tcp_server.c index 3465b1d..74d6f85 100644 --- a/src/base/tcp_server.c +++ b/src/base/tcp_server.c @@ -86,6 +86,7 @@ void sendTcpClientBuffer(client_t *client) data = getBufferData(client->sendBuffer); res = writeTcpSocket(client->socket_tcp, data, len); + //printf("writeTcpSocket = %d\n", res); if( res < 0 ) { @@ -182,6 +183,7 @@ static void eventTcpClient(client_t *client) memset(buffer, 0, STR_PROTO_SIZE); ret = readTcpSocket(client->socket_tcp, buffer, STR_PROTO_SIZE-1); + //printf("readTcpSocket = %d\n", ret); if( ret <= 0 ) { @@ -189,7 +191,11 @@ static void eventTcpClient(client_t *client) return; } - addBuffer(client->recvBuffer, buffer, ret); + if( addBuffer(client->recvBuffer, buffer, ret) < 0 ) + { + client->status = NET_STATUS_ZOMBIE; + return; + } while( getBufferLine(client->recvBuffer, buffer, STR_PROTO_SIZE) >= 0 ) { @@ -206,12 +212,12 @@ void setServerTcpSelect() if( sock_server_tcp != NULL ) { - addSockToSelect(sock_server_tcp->sock); + addSockToSelectRead(sock_server_tcp->sock); } if( sock_server_tcp_second != NULL ) { - addSockToSelect(sock_server_tcp_second->sock); + addSockToSelectRead(sock_server_tcp_second->sock); } for( i = 0 ; i < listClient->count ; i++ ) @@ -225,7 +231,7 @@ void setServerTcpSelect() continue; } - addSockToSelect(client->socket_tcp->sock); + addSockToSelectRead(client->socket_tcp->sock); } } @@ -239,7 +245,7 @@ int selectServerTcpSocket() if( sock_server_tcp != NULL ) { - if( isChangeSockInSelect(sock_server_tcp->sock) ) + if( isChangeSockInSelectRead(sock_server_tcp->sock) ) { eventNewClient(sock_server_tcp); count++; @@ -248,7 +254,7 @@ int selectServerTcpSocket() if( sock_server_tcp_second != NULL ) { - if( isChangeSockInSelect(sock_server_tcp_second->sock) ) + if( isChangeSockInSelectRead(sock_server_tcp_second->sock) ) { eventNewClient(sock_server_tcp_second); count++; @@ -268,14 +274,20 @@ int selectServerTcpSocket() continue; } - if( isChangeSockInSelect(client->socket_tcp->sock) ) + if( isChangeSockInSelectRead(client->socket_tcp->sock) ) { - //printf("eventTcpClient(client);\n"); + //printf("sChangeSockInSelectRead\n"); eventTcpClient(client); count++; } - - sendTcpClientBuffer(client); +/* + if( isChangeSockInSelectWrite(client->socket_tcp->sock) ) + { + //printf("isChangeSockInSelectWrite\n"); + sendTcpClientBuffer(client); + count++; + } +*/ } return count; diff --git a/src/base/udp_server.c b/src/base/udp_server.c index e534975..1c0c38d 100644 --- a/src/base/udp_server.c +++ b/src/base/udp_server.c @@ -220,12 +220,12 @@ void setServerUdpSelect() { if( sock_server_udp != NULL ) { - addSockToSelect(sock_server_udp->sock); + addSockToSelectRead(sock_server_udp->sock); } if( sock_server_udp_second != NULL ) { - addSockToSelect(sock_server_udp_second->sock); + addSockToSelectRead(sock_server_udp_second->sock); } } @@ -237,7 +237,7 @@ int selectServerUdpSocket() if( sock_server_udp != NULL ) { - if( isChangeSockInSelect(sock_server_udp->sock) ) + if( isChangeSockInSelectRead(sock_server_udp->sock) ) { eventClientUdpSelect(sock_server_udp); count++; @@ -246,7 +246,7 @@ int selectServerUdpSocket() if( sock_server_udp_second != NULL ) { - if( isChangeSockInSelect(sock_server_udp_second->sock) ) + if( isChangeSockInSelectRead(sock_server_udp_second->sock) ) { eventClientUdpSelect(sock_server_udp_second); count++; diff --git a/src/client/client.c b/src/client/client.c index 7af0543..08fe9e6 100644 --- a/src/client/client.c +++ b/src/client/client.c @@ -179,6 +179,13 @@ int initClient(char *ip, int port, int proto) return 0; } +static void errorWithServer() +{ + fprintf(stderr, "Server does not respond!\n"); + setMsgToAnalyze(getMyText("ERROR_SERVER_DONT_ALIVE")); + setWorldEnd(); +} + static void sendBuffer() { void *data; @@ -196,8 +203,9 @@ static void sendBuffer() res = writeTcpSocket(sock_server_tcp, data, len); - if( res <= 0 ) + if( res < 0 ) { + errorWithServer(); return; } @@ -230,8 +238,13 @@ void sendServer(char *msg) if( sock_server_tcp != NULL ) { //ret = writeTcpSocket(sock_server_tcp, msg, strlen(msg)); - addBuffer(clientSendBuffer, msg, strlen(msg)); - ret = 1; + ret = addBuffer(clientSendBuffer, msg, strlen(msg)); + } + + if( ret < 0 ) + { + errorWithServer(); + return; } } @@ -252,8 +265,9 @@ static int eventServerSelect() ret = readTcpSocket(sock_server_tcp, buffer, STR_PROTO_SIZE-1); } - if( ret <= 0 ) + if( ret < 0 ) { + errorWithServer(); return ret; } @@ -261,7 +275,11 @@ static int eventServerSelect() traffic_down += ret; #endif - addBuffer(clientRecvBuffer, buffer, ret); + if( addBuffer(clientRecvBuffer, buffer, ret) < 0 ) + { + errorWithServer(); + return ret; + } while( getBufferLine(clientRecvBuffer, buffer, STR_PROTO_SIZE) >= 0 ) { @@ -345,9 +363,7 @@ static void selectClientSocket() { if( isServerAlive() == FALSE ) { - fprintf(stderr, "Server does not respond!\n"); - setMsgToAnalyze(getMyText("ERROR_SERVER_DONT_ALIVE")); - setWorldEnd(); + errorWithServer(); return; } } -- cgit v1.2.3