static int active_send(int fd, char *data) { LOG(vfs_sig_log, LOG_DEBUG, "send %d cmdid %s\n", fd, data); set_client_data(fd, data, strlen(data)); modify_fd_event(fd, EPOLLOUT); return 0; }
void create_push_rsp_err(char *errmsg, int fd) { struct conn *curcon = &acon[fd]; pfs_cs_peer *peer = (pfs_cs_peer *) curcon->user; peer->close = 1; char obuf[2048] = {0x0}; int n = create_sig_msg(CMD_PUT_FILE_RSP, 0x0, (t_pfs_sig_body *)errmsg, obuf, strlen(errmsg)); set_client_data(fd, obuf, n); modify_fd_event(fd, EPOLLOUT); }
/*发起连接与心跳*/ int active_send(log_peer *peer, sig_head *h, sig_body *b) { char buf[2048] = {0x0}; size_t n = 0; peer->hbtime = time(NULL); n = create_sig_msg(h->cmdid, h->status, b, buf, h->bodylen); set_client_data(peer->fd, buf, n); modify_fd_event(peer->fd, EPOLLOUT); LOG(sig_log, LOG_DEBUG, "active send %d cmdid %x\n", peer->fd, h->cmdid); return 0; }
void create_push_rsp(t_pfs_tasklist *task, int fd) { struct conn *curcon = &acon[fd]; pfs_cs_peer *peer = (pfs_cs_peer *) curcon->user; peer->close = 1; char obuf[2048] = {0x0}; t_task_base *base = &(task->task.base); char retbuf[256] = {0x0}; snprintf(retbuf, sizeof(retbuf), "OK|%s|%s", base->retfile, self_domain->domain); int n = create_sig_msg(CMD_PUT_FILE_RSP, 0x0, (t_pfs_sig_body *)retbuf, obuf, sizeof(retbuf)); set_client_data(fd, obuf, n); modify_fd_event(fd, EPOLLOUT); }
static void do_recv(int fd) { struct conn *curcon = &acon[fd]; if (curcon->fd < 0) { LOG(glogfd, LOG_DEBUG, "fd %d already be closed %s\n", fd, FUNC); return; } int n = -1; while (1) { n = recv(fd, iobuf, init_buff_size, MSG_DONTWAIT); if (n > 0) { LOG(glogfd, LOG_TRACE, "fd[%d] recv len %d\n", fd, n); mybuff_setdata(&(curcon->recv_buff), iobuf, n); if (n == init_buff_size) { LOG(glogfd, LOG_TRACE, "fd[%d] need recv nextloop %d\n", fd, n); continue; } break; } if (n == 0) { LOG(glogfd, LOG_ERROR, "fd[%d] close %s:%d!\n", fd, ID, LN); return do_close(fd); } if (errno == EINTR) { LOG(glogfd, LOG_TRACE, "fd[%d] need recv again!\n", fd); continue; } else if (errno == EAGAIN) { LOG(glogfd, LOG_TRACE, "fd[%d] need recv next!\n", fd); modify_fd_event(fd, EPOLLIN); break; } else { LOG(glogfd, LOG_ERROR, "fd[%d] close %s:%d!\n", fd, ID, LN); return do_close(fd); } } int ret = solib.svc_recv(fd); switch (ret) { case RECV_SEND: do_send(fd); break; case RECV_ADD_EPOLLIN: modify_fd_event(fd, EPOLLIN); break; case RECV_ADD_EPOLLOUT: modify_fd_event(fd, EPOLLOUT); break; case RECV_ADD_EPOLLALL: modify_fd_event(fd, EPOLLOUT|EPOLLIN); break; case RECV_CLOSE: LOG(glogfd, LOG_ERROR, "fd[%d] close %s:%d!\n", fd, ID, LN); do_close(fd); break; } }
static void do_send(int fd) { LOG(glogfd, LOG_TRACE, "%s:%s:%d\n", ID, FUNC, LN); int ret = SEND_ADD_EPOLLIN; int n = 0; struct conn *curcon = &acon[fd]; if (curcon->fd < 0) { LOG(glogfd, LOG_DEBUG, "fd %d already be closed %s\n", fd, FUNC); return; } int localfd; off_t start; char* data; size_t len; if(!mybuff_getdata(&(curcon->send_buff), &data, &len)) { LOG(glogfd, LOG_TRACE, "fd[%d] get len from data [%d]\n", fd, len); while (1) { n = send(fd, data, len, MSG_DONTWAIT | MSG_NOSIGNAL); if(n > 0) { LOG(glogfd, LOG_NORMAL, "fd[%d] send len %d, datalen %d\n", fd, n, len); mybuff_skipdata(&(curcon->send_buff), n); if (n < len) ret = SEND_ADD_EPOLLOUT; curcon->send_len += n; } else if(errno == EINTR) continue; else if(errno == EAGAIN) ret = SEND_ADD_EPOLLOUT; else { LOG(glogfd, LOG_ERROR, "%s:%s:%d fd[%d] send err %d:%d:%m\n", ID, FUNC, LN, fd, n, len); ret = SEND_CLOSE; } break; } } if(ret == SEND_ADD_EPOLLIN && !mybuff_getfile(&(curcon->send_buff), &localfd, &start, &len)) { LOG(glogfd, LOG_TRACE, "fd[%d] get len from file [%d]\n", fd, len); size_t len1 = len > GSIZE ? GSIZE : len; while (1) { n = sendfile64(fd, localfd, &start, len1); if(n > 0) { mybuff_skipfile(&(curcon->send_buff), n); LOG(glogfd, LOG_TRACE, "%s:%s:%d fd[%d] send len %d, datalen %d\n", ID, FUNC, LN, fd, n, len1); if(n < len) ret = SEND_ADD_EPOLLOUT; curcon->send_len += n; } else if(errno == EINTR) continue; else if(errno == EAGAIN || errno == ENOENT) ret = SEND_ADD_EPOLLOUT; else { LOG(glogfd, LOG_ERROR, "%s:%s:%d fd[%d] send err %d:%d:%m\n", ID, FUNC, LN, fd, n, len); ret = SEND_CLOSE; } break; } } switch (ret) { case SEND_CLOSE: do_close(fd); return; case SEND_ADD_EPOLLIN: modify_fd_event(fd, EPOLLIN); break; case SEND_ADD_EPOLLOUT: modify_fd_event(fd, EPOLLOUT); break; case SEND_ADD_EPOLLALL: modify_fd_event(fd, EPOLLOUT|EPOLLIN); break; } if (n > 0 && solib.svc_send_once) solib.svc_send_once(fd); if (ret == SEND_ADD_EPOLLIN && solib.svc_send) if (solib.svc_send(fd) == SEND_CLOSE) { LOG(glogfd, LOG_ERROR, "%s:%s:%d send close\n", ID, FUNC, LN); do_close(fd); } }