int Server::read_session(Session *sess){ Link *link = sess->link; if(link->error()){ return 0; } int len = link->read(); if(len <= 0){ this->close_session(sess); return -1; } while(1){ Request req; int ret = link->recv(&req.msg); if(ret == -1){ log_info("fd: %d, parse error, delete link", link->fd()); this->close_session(sess); return -1; }else if(ret == 0){ // 报文未就绪, 继续读网络 break; } req.stime = millitime(); req.sess = *sess; Response resp; for(int i=0; i<this->handlers.size(); i++){ Handler *handler = this->handlers[i]; req.time_wait = 1000 * (millitime() - req.stime); HandlerState state = handler->proc(req, &resp); req.time_proc = 1000 * (millitime() - req.stime) - req.time_wait; if(state == HANDLE_RESP){ link->send(resp.msg); if(link && !link->output.empty()){ fdes->set(link->fd(), FDEVENT_OUT, DEFAULT_TYPE, sess); } if(log_level() >= Logger::LEVEL_DEBUG){ log_debug("w:%.3f,p:%.3f, req: %s resp: %s", req.time_wait, req.time_proc, msg_str(req.msg).c_str(), msg_str(resp.msg).c_str()); } }else if(state == HANDLE_FAIL){ this->close_session(sess); return -1; } } } return 0; }