From aecb6c466c1e7efa0f07809aa18096e7d5559850 Mon Sep 17 00:00:00 2001 From: oroborus Date: Tue, 5 Aug 2008 15:56:30 +0000 Subject: - server/client poziva neblokujuci rezim TCP socketov git-svn-id: http://opensvn.csie.org/tuxanci_ng@190 0ee4d065-81f0-4d1e-b06c-ff20ad07cc3e --- src/base/buffer.c | 12 ++++++++++- src/base/buffer.h | 4 +++- src/base/server.c | 18 ++++++++++++----- src/base/server.h | 4 +++- src/base/tcp_server.c | 56 +++++++++++++++++++++++++++++++++++++++++---------- src/base/tcp_server.h | 3 +++ 6 files changed, 78 insertions(+), 19 deletions(-) (limited to 'src/base') 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 -- cgit v1.2.3