--- libaitrpc/src/srv.c 2012/11/16 08:33:06 1.12.2.1 +++ libaitrpc/src/srv.c 2012/11/16 08:51:36 1.12.2.2 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: srv.c,v 1.12.2.1 2012/11/16 08:33:06 misho Exp $ +* $Id: srv.c,v 1.12.2.2 2012/11/16 08:51:36 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -46,12 +46,21 @@ SUCH DAMAGE. #include "global.h" +/* SOCK_STREAM */ static void *acceptClients(sched_task_t *); static void *closeClient(sched_task_t *); -static sched_task_func_t cbProto[SOCK_RAW][2] = { - { acceptClients, closeClient }, - { acceptClients, closeClient }, - { NULL, NULL } +static void *rxPacket(sched_task_t *); +static void *txPacket(sched_task_t *); + +/* SOCK_DGRAM */ + +/* SOCK_RAW */ + +static sched_task_func_t cbProto[SOCK_RAW + 1][4] = { + { acceptClients, closeClient, rxPacket, txPacket }, /* SOCK_STREAM */ + { acceptClients, closeClient, rxPacket, txPacket }, /* SOCK_STREAM */ + { NULL, NULL, NULL, NULL }, + { NULL, NULL, NULL, NULL } /* SOCK_RAW */ }; @@ -197,8 +206,8 @@ rxPacket(sched_task_t *task) if (!off) memset(buf, 0, AIT_LEN(&c->cli_buf)); - else - memmove(buf, buf + off, AIT_LEN(&c->cli_buf) - off); +// else +// memmove(buf, buf + off, AIT_LEN(&c->cli_buf) - off); rlen = recv(TASK_FD(task), buf + off, AIT_LEN(&c->cli_buf) - off, 0); if (rlen < 1) { /* close connection */ @@ -258,7 +267,8 @@ rxPacket(sched_task_t *task) /* send RPC reply */ if (!noreply) - schedWrite(TASK_ROOT(task), txPacket, TASK_ARG(task), TASK_FD(task), rpc, len); + schedWrite(TASK_ROOT(task), cbProto[s->srv_proto][CB_TXPACKET], + TASK_ARG(task), TASK_FD(task), rpc, len); off += len; } while (rlen > 0); @@ -306,7 +316,8 @@ acceptClients(sched_task_t *task) } else fcntl(c->cli_sock, F_SETFL, fcntl(c->cli_sock, F_GETFL) | O_NONBLOCK); - schedRead(TASK_ROOT(task), rxPacket, c, c->cli_sock, NULL, 0); + schedRead(TASK_ROOT(task), cbProto[srv->srv_proto][CB_RXPACKET], c, + c->cli_sock, NULL, 0); end: schedReadSelf(task); return NULL;