|
|
| version 1.19.2.3, 2013/09/05 00:41:54 | version 1.20.4.3, 2013/11/14 13:37:08 |
|---|---|
| Line 165 txPacket(sched_task_t *task) | Line 165 txPacket(sched_task_t *task) |
| struct tagRPCCall *rpc = (struct tagRPCCall*) buf; | struct tagRPCCall *rpc = (struct tagRPCCall*) buf; |
| int ret, estlen, wlen = sizeof(struct tagRPCCall); | int ret, estlen, wlen = sizeof(struct tagRPCCall); |
| struct pollfd pfd; | struct pollfd pfd; |
| #ifdef TCP_SESSION_TIMEOUT | |
| struct timespec ts = { DEF_RPC_TIMEOUT, 0 }; | |
| schedCancelby(TASK_ROOT(task), taskTIMER, CRITERIA_DATA, TASK_ARG(task), NULL); | |
| schedTimer(TASK_ROOT(task), cbProto[s->srv_proto][CB_CLOSECLIENT], | |
| TASK_ARG(task), ts, TASK_ARG(task), 0); | |
| #endif | |
| if (rpc->call_argc) { | if (rpc->call_argc) { |
| f = rpc_srv_getCall(s, ntohs(rpc->call_tag)); | f = rpc_srv_getCall(s, ntohs(rpc->call_tag)); |
| if (!f) { | if (!f) { |
| Line 305 rxPacket(sched_task_t *task) | Line 312 rxPacket(sched_task_t *task) |
| u_char *buf = AIT_GET_BUF(&c->cli_buf); | u_char *buf = AIT_GET_BUF(&c->cli_buf); |
| struct tagRPCCall *rpc = (struct tagRPCCall*) buf; | struct tagRPCCall *rpc = (struct tagRPCCall*) buf; |
| struct pollfd pfd; | struct pollfd pfd; |
| #ifdef TCP_SESSION_TIMEOUT | |
| struct timespec ts = { DEF_RPC_TIMEOUT, 0 }; | |
| schedCancelby(TASK_ROOT(task), taskTIMER, CRITERIA_DATA, TASK_ARG(task), NULL); | |
| schedTimer(TASK_ROOT(task), cbProto[s->srv_proto][CB_CLOSECLIENT], | |
| TASK_ARG(task), ts, TASK_ARG(task), 0); | |
| #endif | |
| memset(buf, 0, sizeof(struct tagRPCCall)); | memset(buf, 0, sizeof(struct tagRPCCall)); |
| rlen = recv(TASK_FD(task), rpc, sizeof(struct tagRPCCall), MSG_PEEK); | rlen = recv(TASK_FD(task), rpc, sizeof(struct tagRPCCall), MSG_PEEK); |
| if (rlen < sizeof(struct tagRPCCall)) { | if (rlen < sizeof(struct tagRPCCall)) { |
| Line 386 acceptClients(sched_task_t *task) | Line 400 acceptClients(sched_task_t *task) |
| rpc_srv_t *srv = TASK_ARG(task); | rpc_srv_t *srv = TASK_ARG(task); |
| rpc_cli_t *c = NULL; | rpc_cli_t *c = NULL; |
| socklen_t salen = sizeof(sockaddr_t); | socklen_t salen = sizeof(sockaddr_t); |
| int sock; | |
| #ifdef TCP_SESSION_TIMEOUT | |
| struct timespec ts = { DEF_RPC_TIMEOUT, 0 }; | |
| #endif | |
| c = _allocClient(srv, NULL); | c = _allocClient(srv, NULL); |
| if (!c) | if (!c) { |
| EVERBOSE(1, "RPC client quota exceeded! Connection will be shutdown!\n"); | |
| if ((sock = accept(TASK_FD(task), NULL, NULL)) != -1) { | |
| shutdown(sock, SHUT_RDWR); | |
| close(sock); | |
| } | |
| goto end; | goto end; |
| } | |
| /* accept client */ | /* accept client */ |
| c->cli_sock = accept(TASK_FD(task), &c->cli_sa.sa, &salen); | c->cli_sock = accept(TASK_FD(task), &c->cli_sa.sa, &salen); |
| Line 401 acceptClients(sched_task_t *task) | Line 425 acceptClients(sched_task_t *task) |
| } else | } else |
| fcntl(c->cli_sock, F_SETFL, fcntl(c->cli_sock, F_GETFL) | O_NONBLOCK); | fcntl(c->cli_sock, F_SETFL, fcntl(c->cli_sock, F_GETFL) | O_NONBLOCK); |
| #ifdef TCP_SESSION_TIMEOUT | |
| /* armed timer for close stateless connection */ | |
| schedCancelby(TASK_ROOT(task), taskTIMER, CRITERIA_DATA, c, NULL); | |
| schedTimer(TASK_ROOT(task), cbProto[srv->srv_proto][CB_CLOSECLIENT], c, | |
| ts, c, 0); | |
| #endif | |
| schedRead(TASK_ROOT(task), cbProto[srv->srv_proto][CB_RXPACKET], c, | schedRead(TASK_ROOT(task), cbProto[srv->srv_proto][CB_RXPACKET], c, |
| c->cli_sock, NULL, 0); | c->cli_sock, NULL, 0); |
| end: | end: |
| Line 712 acceptBLOBClients(sched_task_t *task) | Line 742 acceptBLOBClients(sched_task_t *task) |
| rpc_cli_t *c = NULL; | rpc_cli_t *c = NULL; |
| register int i; | register int i; |
| socklen_t salen = sizeof(sockaddr_t); | socklen_t salen = sizeof(sockaddr_t); |
| int sock; | |
| #ifdef TCP_NOPUSH | #ifdef TCP_NOPUSH |
| int n = 1; | int n = 1; |
| #endif | #endif |
| Line 719 acceptBLOBClients(sched_task_t *task) | Line 750 acceptBLOBClients(sched_task_t *task) |
| /* check free slots for connect */ | /* check free slots for connect */ |
| for (i = 0; i < array_Size(srv->srv_blob.clients) && | for (i = 0; i < array_Size(srv->srv_blob.clients) && |
| (c = array(srv->srv_blob.clients, i, rpc_cli_t*)); i++); | (c = array(srv->srv_blob.clients, i, rpc_cli_t*)); i++); |
| if (c) /* no more free slots! */ | if (c) { /* no more free slots! */ |
| EVERBOSE(1, "BLOB client quota exceeded! Connection will be shutdown!\n"); | |
| if ((sock = accept(TASK_FD(task), NULL, NULL)) != -1) { | |
| shutdown(sock, SHUT_RDWR); | |
| close(sock); | |
| } | |
| goto end; | goto end; |
| } | |
| c = e_malloc(sizeof(rpc_cli_t)); | c = e_malloc(sizeof(rpc_cli_t)); |
| if (!c) { | if (!c) { |
| LOGERR; | LOGERR; |