summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--config.h2
-rw-r--r--data/conf/server.conf2
-rwxr-xr-xsrc/base/buffer.c12
-rwxr-xr-xsrc/base/buffer.h4
-rw-r--r--src/base/server.c18
-rw-r--r--src/base/server.h4
-rw-r--r--src/base/tcp_server.c56
-rw-r--r--src/base/tcp_server.h3
-rw-r--r--src/client/client.c52
-rw-r--r--src/client/client.h2
-rwxr-xr-xsrc/net/tcp.c28
-rw-r--r--src/net/tcp.h1
12 files changed, 155 insertions, 29 deletions
diff --git a/config.h b/config.h
index bcb921f..68f1d4b 100644
--- a/config.h
+++ b/config.h
@@ -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);