diff options
| -rw-r--r-- | config.h | 2 | ||||
| -rw-r--r-- | data/conf/server.conf | 2 | ||||
| -rwxr-xr-x | src/base/buffer.c | 12 | ||||
| -rwxr-xr-x | src/base/buffer.h | 4 | ||||
| -rw-r--r-- | src/base/server.c | 18 | ||||
| -rw-r--r-- | src/base/server.h | 4 | ||||
| -rw-r--r-- | src/base/tcp_server.c | 56 | ||||
| -rw-r--r-- | src/base/tcp_server.h | 3 | ||||
| -rw-r--r-- | src/client/client.c | 52 | ||||
| -rw-r--r-- | src/client/client.h | 2 | ||||
| -rwxr-xr-x | src/net/tcp.c | 28 | ||||
| -rw-r--r-- | src/net/tcp.h | 1 |
12 files changed, 155 insertions, 29 deletions
@@ -1 +1 @@ -#define TUXANCI_VERSION "svn189" +#define TUXANCI_VERSION "svn190" diff --git a/data/conf/server.conf b/data/conf/server.conf index b50f11c..1b32830 100644 --- a/data/conf/server.conf +++ b/data/conf/server.conf @@ -15,4 +15,4 @@ MAX_ITEM 10 LOG_FILE tuxanci-server.log SCORE_FILE height-score.txt -SUPPORT_CLIENTS 0.20.0 svn189 svn188 svn187 svn186 +SUPPORT_CLIENTS 0.20.0 svn190 svn189 svn188 svn187 svn186 diff --git a/src/base/buffer.c b/src/base/buffer.c index 13d3225..f3ec070 100755 --- a/src/base/buffer.c +++ b/src/base/buffer.c @@ -19,6 +19,16 @@ buffer_t * newBuffer(int n) return new; } +void* getBufferData(buffer_t *p) +{ + return p->data; +} + +int getBufferSize(buffer_t *p) +{ + return p->size; +} + int addBuffer(buffer_t *p, char *data, int len) { assert( p != NULL ); @@ -101,7 +111,7 @@ int getBufferLine(buffer_t *p, char *line, int len) return ret_len; } -int getBufferData(buffer_t *p, char *line, int len) +int getBufferDataLen(buffer_t *p, char *line, int len) { assert( p != NULL ); assert( line != NULL ); diff --git a/src/base/buffer.h b/src/base/buffer.h index c9cdee5..1b9e6ee 100755 --- a/src/base/buffer.h +++ b/src/base/buffer.h @@ -13,11 +13,13 @@ typedef struct str_buffer } buffer_t; extern buffer_t * newBuffer(int n); +extern void* getBufferData(buffer_t *p); +extern int getBufferSize(buffer_t *p); extern int addBuffer(buffer_t *p, char *data, int len); extern int cutBuffer(buffer_t *p, int len); extern int getBufferCount(buffer_t *p); extern int getBufferLine(buffer_t *p, char *line, int len); -extern int getBufferData(buffer_t *p, char *line, int len); +extern int getBufferDataLen(buffer_t *p, char *line, int len); extern void destroyBuffer(buffer_t *p); #endif diff --git a/src/base/server.c b/src/base/server.c index ad057a2..a0bfb60 100644 --- a/src/base/server.c +++ b/src/base/server.c @@ -317,7 +317,9 @@ void sendClient(client_t *p, char *msg) ret = writeUdpSocket(p->socket_udp, p->socket_udp, msg, strlen(msg)); break; case CLIENT_TYPE_TCP : - ret = writeTcpSocket(p->socket_tcp, msg, strlen(msg)); + //ret = writeTcpSocket(p->socket_tcp, msg, strlen(msg)); + addBuffer(p->sendBuffer, msg, strlen(msg)); + ret = 1; break; default : assert( ! "zly typ !"); @@ -331,7 +333,7 @@ void sendClient(client_t *p, char *msg) } } -static void eventClientBuffer(client_t *client) +static void eventClientWorkRecvList(client_t *client) { proto_cmd_server_t* protoCmd; char *line; @@ -368,7 +370,7 @@ static void eventClientBuffer(client_t *client) client->listRecvMsg = newList(); } -static void eventClientListBuffer() +static void porcesListClients() { int i; client_t *thisClient; @@ -376,8 +378,14 @@ static void eventClientListBuffer() for( i = 0 ; i < listClient->count; i++) { thisClient = (client_t *) listClient->list[i]; - eventClientBuffer(thisClient); + + eventClientWorkRecvList(thisClient); eventMsgInCheckFront(thisClient); + + if( thisClient->type == CLIENT_TYPE_TCP ) + { + sendTcpClientBuffer(thisClient); + } } } @@ -418,7 +426,7 @@ void eventServer() } #endif - eventClientListBuffer(); + porcesListClients(); eventTimer(listServerTimer); } diff --git a/src/base/server.h b/src/base/server.h index 2e731a7..63d1c09 100644 --- a/src/base/server.h +++ b/src/base/server.h @@ -33,7 +33,9 @@ typedef struct client_struct int type; sock_udp_t *socket_udp; sock_tcp_t *socket_tcp; - buffer_t *buffer; + + buffer_t *recvBuffer; + buffer_t *sendBuffer; int status; diff --git a/src/base/tcp_server.c b/src/base/tcp_server.c index 01a7b17..3465b1d 100644 --- a/src/base/tcp_server.c +++ b/src/base/tcp_server.c @@ -52,10 +52,11 @@ client_t* newTcpClient(sock_tcp_t *sock_tcp) assert( sock_tcp != NULL ); - new = newAnyClient(); + new = newAnyClient(); new->type = CLIENT_TYPE_TCP; new->socket_tcp = sock_tcp; - new->buffer = newBuffer(4096); + new->recvBuffer = newBuffer(SERVER_TCP_BUFFER_LIMIT); + new->sendBuffer = newBuffer(SERVER_TCP_BUFFER_LIMIT); #ifdef PUBLIC_SERVER char str_log[STR_LOG_SIZE]; @@ -69,23 +70,51 @@ client_t* newTcpClient(sock_tcp_t *sock_tcp) return new; } -void destroyTcpClient(client_t *p) +void sendTcpClientBuffer(client_t *client) { - eventMsgInCheckFront(p); + void *data; + int len; + int res; + + len = getBufferSize(client->sendBuffer); + + if( len == 0 ) + { + return; + } + + data = getBufferData(client->sendBuffer); + + res = writeTcpSocket(client->socket_tcp, data, len); + + if( res < 0 ) + { + client->status = NET_STATUS_ZOMBIE; + return; + } + + cutBuffer(client->sendBuffer, res); +} + +void destroyTcpClient(client_t *client) +{ + eventMsgInCheckFront(client); + sendTcpClientBuffer(client); #ifdef PUBLIC_SERVER char str_log[STR_LOG_SIZE]; char str_ip[STR_IP_SIZE]; - getSockTcpIp(p->socket_tcp, str_ip, STR_IP_SIZE); - sprintf(str_log, "close TCP connect %s %d", str_ip, getSockTcpPort(p->socket_tcp)); + getSockTcpIp(client->socket_tcp, str_ip, STR_IP_SIZE); + sprintf(str_log, "close TCP connect %s %d", str_ip, getSockTcpPort(client->socket_tcp)); addToLog(LOG_INF, str_log); #endif - closeTcpSocket(p->socket_tcp); - destroyBuffer(p->buffer); + closeTcpSocket(client->socket_tcp); + destroyBuffer(client->recvBuffer); + destroyBuffer(client->sendBuffer); - destroyAnyClient(p); + destroyAnyClient(client); } int initTcpServer(char *ip4, int port4, char *ip6, int port6) @@ -136,8 +165,11 @@ static void eventNewClient(sock_tcp_t *server_sock) client_t *client; listClient = getListServerClient(); + sock = getTcpNewClient(server_sock); disableNagle(sock); + setTcpSockNonBlock(sock); + client = newTcpClient(sock); addList(listClient, client); } @@ -157,9 +189,9 @@ static void eventTcpClient(client_t *client) return; } - addBuffer(client->buffer, buffer, ret); + addBuffer(client->recvBuffer, buffer, ret); - while( getBufferLine(client->buffer, buffer, STR_PROTO_SIZE) >= 0 ) + while( getBufferLine(client->recvBuffer, buffer, STR_PROTO_SIZE) >= 0 ) { addList(client->listRecvMsg, strdup(buffer) ); } @@ -242,6 +274,8 @@ int selectServerTcpSocket() eventTcpClient(client); count++; } + + sendTcpClientBuffer(client); } return count; diff --git a/src/base/tcp_server.h b/src/base/tcp_server.h index 6cae061..21ef90c 100644 --- a/src/base/tcp_server.h +++ b/src/base/tcp_server.h @@ -6,11 +6,14 @@ #include "server.h" #include "tcp.h" +#define SERVER_TCP_BUFFER_LIMIT 4096 + extern client_t* newTcpClient(sock_tcp_t *sock_tcp); extern void destroyTcpClient(client_t *p); extern int initTcpServer(char *ip4, int port4, char *ip6, int port6); extern void setServerTcpSelect(); extern int selectServerTcpSocket(); +extern void sendTcpClientBuffer(client_t *p); extern void quitTcpServer(); #endif diff --git a/src/client/client.c b/src/client/client.c index 789233e..7af0543 100644 --- a/src/client/client.c +++ b/src/client/client.c @@ -35,7 +35,10 @@ static sock_udp_t *sock_server_udp; static sock_tcp_t *sock_server_tcp; static list_t *listRecvMsg; -static buffer_t *clientBuffer; + +static buffer_t *clientRecvBuffer; +static buffer_t *clientSendBuffer; + static my_time_t lastPing; static my_time_t lastPingServerAlive; @@ -115,6 +118,7 @@ static int initTcpClient(char *ip, int port, int proto) } disableNagle(sock_server_tcp); + setTcpSockNonBlock(sock_server_tcp); printf("connect TCP %s %d\n", ip, port); @@ -136,7 +140,8 @@ int initClient(char *ip, int port, int proto) traffic_up = 0; #endif - clientBuffer = newBuffer(4096); + clientRecvBuffer = newBuffer(CLIENT_BUFFER_LIMIT); + clientSendBuffer = newBuffer(CLIENT_BUFFER_LIMIT); if( ! isParamFlag("--udp") && ! isParamFlag("--tcp") ) { @@ -174,6 +179,31 @@ int initClient(char *ip, int port, int proto) return 0; } +static void sendBuffer() +{ + void *data; + int len; + int res; + + len = getBufferSize(clientSendBuffer); + + if( len == 0 ) + { + return; + } + + data = getBufferData(clientSendBuffer); + + res = writeTcpSocket(sock_server_tcp, data, len); + + if( res <= 0 ) + { + return; + } + + cutBuffer(clientSendBuffer, res); +} + void sendServer(char *msg) { int ret; @@ -199,7 +229,9 @@ void sendServer(char *msg) if( sock_server_tcp != NULL ) { - ret = writeTcpSocket(sock_server_tcp, msg, strlen(msg)); + //ret = writeTcpSocket(sock_server_tcp, msg, strlen(msg)); + addBuffer(clientSendBuffer, msg, strlen(msg)); + ret = 1; } } @@ -229,9 +261,9 @@ static int eventServerSelect() traffic_down += ret; #endif - addBuffer(clientBuffer, buffer, ret); + addBuffer(clientRecvBuffer, buffer, ret); - while( getBufferLine(clientBuffer, buffer, STR_PROTO_SIZE) >= 0 ) + while( getBufferLine(clientRecvBuffer, buffer, STR_PROTO_SIZE) >= 0 ) { if( strlen(buffer) > 0) { @@ -242,7 +274,7 @@ static int eventServerSelect() return ret; } -static void eventServerBuffer() +static void eventClientWorkRecvList() { proto_cmd_client_t *protoCmd; char *line; @@ -384,7 +416,8 @@ void eventClient() eventPingServer(); selectClientSocket(); - eventServerBuffer(); + eventClientWorkRecvList(); + sendBuffer(); } static void quitUdpClient() @@ -406,9 +439,12 @@ static void quitTcpClient() void quitClient() { proto_send_end_client(); + assert( listRecvMsg != NULL ); + destroyListItem(listRecvMsg, free); - destroyBuffer(clientBuffer); + destroyBuffer(clientRecvBuffer); + destroyBuffer(clientSendBuffer); if( sock_server_udp != NULL ) { diff --git a/src/client/client.h b/src/client/client.h index 32ae6e5..8766594 100644 --- a/src/client/client.h +++ b/src/client/client.h @@ -9,6 +9,8 @@ #define CLIENT_TIMEOUT 1000 #define SERVER_TIMEOUT_ALIVE 5000 +#define CLIENT_BUFFER_LIMIT 4096 + extern int initClient(char *ip, int port, int proto); extern void sendServer(char *msg); extern void eventClient(); diff --git a/src/net/tcp.c b/src/net/tcp.c index 1c3f6c0..f6c3dad 100755 --- a/src/net/tcp.c +++ b/src/net/tcp.c @@ -18,6 +18,7 @@ #include <sys/socket.h> #include <netinet/in.h> #include <netinet/tcp.h> +#include <fcntl.h> #include "tcp.h" @@ -274,6 +275,33 @@ int disableNagle(sock_tcp_t *p) return result; } +int setTcpSockNonBlock(sock_tcp_t *p) +{ + /* Set to nonblocking socket mode */ +#ifndef __WIN32__ + int oldFlag; + + oldFlag = fcntl (p->sock, F_GETFL, 0); + + if( fcntl(p->sock, F_SETFL, oldFlag | O_NONBLOCK) == -1 ) + { + //printf("error setTcpSockNonBlock\n"); + return -1; + } + + //printf("setTcpSockNonBlock OK\n"); +#else + unsigned long arg = 1; + // Operation is FIONBIO. Parameter is pointer on non-zero number. + if( ioctlsocket(p->sock, FIONBIO, &arg) == SOCKET_ERROR ) + { + WSACleanup(); + return -1; + } +#endif + return 0; +} + int readTcpSocket(sock_tcp_t *p, void *address, int len) { assert( p != NULL ); diff --git a/src/net/tcp.h b/src/net/tcp.h index b7ea55b..ae870b3 100644 --- a/src/net/tcp.h +++ b/src/net/tcp.h @@ -29,6 +29,7 @@ extern void getSockTcpIp(sock_tcp_t *p, char *str_ip, int len); extern int getSockTcpPort(sock_tcp_t *p); extern sock_tcp_t* connectTcpSocket(char *ip, int port, int proto); extern int disableNagle(sock_tcp_t *p); +extern int setTcpSockNonBlock(sock_tcp_t *p); extern int readTcpSocket(sock_tcp_t *p, void *address, int len); extern int writeTcpSocket(sock_tcp_t *p, void *address, int len); extern void closeTcpSocket(sock_tcp_t *p); |