summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--config.h2
-rw-r--r--data/conf/server.conf2
-rwxr-xr-xsrc/base/buffer.c2
-rw-r--r--src/base/server.c3
-rw-r--r--src/base/serverSelect.c36
-rw-r--r--src/base/serverSelect.h5
-rw-r--r--src/base/tcp_server.c32
-rw-r--r--src/base/udp_server.c8
-rw-r--r--src/client/client.c32
9 files changed, 88 insertions, 34 deletions
diff --git a/config.h b/config.h
index 68f1d4b..c677023 100644
--- a/config.h
+++ b/config.h
@@ -1 +1 @@
-#define TUXANCI_VERSION "svn190"
+#define TUXANCI_VERSION "svn191"
diff --git a/data/conf/server.conf b/data/conf/server.conf
index 1b32830..bb4b056 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 svn190 svn189 svn188 svn187 svn186
+SUPPORT_CLIENTS 0.20.0 svn191 svn190 svn189 svn188 svn187 svn186
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;
}
}