summaryrefslogtreecommitdiff
path: root/src/base
diff options
context:
space:
mode:
authororoborus <oroborus@0ee4d065-81f0-4d1e-b06c-ff20ad07cc3e>2008-08-05 15:56:30 +0000
committeroroborus <oroborus@0ee4d065-81f0-4d1e-b06c-ff20ad07cc3e>2008-08-05 15:56:30 +0000
commitaecb6c466c1e7efa0f07809aa18096e7d5559850 (patch)
treefaf97599f2562a3da4e43df3587f16666704ce7e /src/base
parentb5723cbd822b2359850c121ca69e682a607d91bd (diff)
- server/client poziva neblokujuci rezim TCP socketov
git-svn-id: http://opensvn.csie.org/tuxanci_ng@190 0ee4d065-81f0-4d1e-b06c-ff20ad07cc3e
Diffstat (limited to 'src/base')
-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
6 files changed, 78 insertions, 19 deletions
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