|
|
| version 1.26.2.6, 2015/06/28 21:40:46 | version 1.26.2.7, 2015/06/29 17:05:27 |
|---|---|
| Line 183 txPacket(sched_task_t *task) | Line 183 txPacket(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; |
| int ret, estlen, wlen = sizeof(struct tagRPCCall); | int ret, estlen, wlen = sizeof(struct tagRPCCall); |
| struct pollfd pfd; | |
| #ifdef TCP_SESSION_TIMEOUT | #ifdef TCP_SESSION_TIMEOUT |
| struct timespec ts = { DEF_RPC_TIMEOUT, 0 }; | struct timespec ts = { DEF_RPC_TIMEOUT, 0 }; |
| Line 236 txPacket(sched_task_t *task) | Line 235 txPacket(sched_task_t *task) |
| #endif | #endif |
| /* send reply */ | /* send reply */ |
| pfd.fd = TASK_FD(task); | ret = send(TASK_FD(task), buf, MIN(wlen, s->srv_netbuf), MSG_NOSIGNAL); |
| pfd.events = POLLOUT; | if (ret == -1) { |
| for (; wlen > 0; wlen -= ret, buf += ret) { | /* close connection */ |
| if ((ret = poll(&pfd, 1, DEF_RPC_TIMEOUT * 1000)) < 1 || | schedEvent(TASK_ROOT(task), cbProto[s->srv_proto][CB_CLOSECLIENT], |
| pfd.revents & (POLLERR | POLLHUP | POLLNVAL)) { | TASK_ARG(task), 0, NULL, 0); |
| if (ret) | return NULL; |
| LOGERR; | |
| else | |
| rpc_SetErr(ETIMEDOUT, "Timeout reached! Client not respond"); | |
| /* close connection */ | |
| schedEvent(TASK_ROOT(task), cbProto[s->srv_proto][CB_CLOSECLIENT], | |
| TASK_ARG(task), 0, NULL, 0); | |
| return NULL; | |
| } | |
| ret = send(TASK_FD(task), buf, MIN(wlen, s->srv_netbuf), MSG_NOSIGNAL); | |
| if (ret == -1) { | |
| /* close connection */ | |
| schedEvent(TASK_ROOT(task), cbProto[s->srv_proto][CB_CLOSECLIENT], | |
| TASK_ARG(task), 0, NULL, 0); | |
| return NULL; | |
| } | |
| } | } |
| return NULL; | return NULL; |