summaryrefslogtreecommitdiff
path: root/src/base/tcp_server.c
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/tcp_server.c
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/tcp_server.c')
-rw-r--r--src/base/tcp_server.c56
1 files changed, 45 insertions, 11 deletions
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;