// #include "tcp_connection.hpp" // #include "abstract_coder.hpp" // #include "coroutine_hook.hpp" // #include "fd_event.hpp" // #include "logger.hpp" // #include "reactor.hpp" // #include "tcp_client.hpp" // #include "tcp_server.hpp" // #include "tinypb_data.hpp" // #include // #include // #include // #include // #include // namespace tinyrpc { // TcpConnection::TcpConnection(int fd, Reactor& reactor, TcpServer& ser, Type type) : // m_fdEvent(FdEventPool::getInstance()->getFdEvent(fd)), // m_mainCoroutine(std::bind(&TcpConnection::mainLoopFun, this)), // m_reactor(reactor), // m_server(ser), // m_connectType(type) // { // Reactor::Task task = [this] { // logger() << "conn coroutine is resume"; // m_mainCoroutine.resume(); // }; // reactor.addTask(task, true); // } // void TcpConnection::mainLoopFun() { // while(m_state == State::Connected) { // input(); // process(); // output(); // } // logger() << "this conn loop has already break"; // } // void TcpConnection::clearClient() { // logger() << "clearClient"; // m_state = State::Disconnected; // m_reactor.delFdEvent(m_fdEvent); // m_fdEvent->reset(); // close(m_fdEvent->getFd()); // } // void TcpConnection::input() { // 调用 read_hook 读数据到应用层缓冲区 // logger() << "input"; // if(m_state == State::Disconnected) { // logger() << "input: this conn has already break"; // return; // } // while(true) { // if(m_readBuffer.getWriteable() == 0) { // m_readBuffer.dilatation(); // } // int ret = read_hook(m_fdEvent->getFd(), m_readBuffer.getWriteAddress(), m_readBuffer.getWriteable()); // if(ret == -1) { // logger() << "read_hook ret -1 err:" << strerror(errno); // // if(errno == EAGAIN) exit(-1); // break; // } else if(ret == 0) { // 对端关闭了连接 // clearClient(); // break; // } else { // int writeable = m_readBuffer.getWriteable(); // m_readBuffer.writeOffset(ret); // logger() << "input_hook ret: " << ret; // if(ret < writeable) { // 读完了结束循环 // break; // } // } // } // } // void TcpConnection::output() { // logger() << "output"; // if(m_state == State::Disconnected) { // return; // } // while(true) { // if(m_writeBuffer.getReadable() == 0) { // logger() << "no data need send"; // break; // } // int ret = write_hook(m_fdEvent->getFd(), m_writeBuffer.getReadAddress(), m_writeBuffer.getReadable()); // if(ret == -1) { // logger() << "read_hook ret -1 err:" << strerror(errno); // break; // } else if(ret == 0) { // logger() << "write_hook ret 0"; // break; // } else { // m_writeBuffer.readOffset(ret); // } // logger() << "write_hook ret: " << ret; // } // } // void TcpConnection::process() { // logger() << "process"; // // if(m_state == State::Disconnected) { // // return; // // } // // if(m_writeBuffer.getWriteable() < m_readBuffer.getReadable()) { // // m_writeBuffer.resize(m_readBuffer.getReadable() * 2); // // } // // std::memcpy(m_writeBuffer.getWriteAddress(), m_readBuffer.getReadAddress(), m_readBuffer.getReadable()); // // m_writeBuffer.writeOffset(m_readBuffer.getReadable()); // // m_readBuffer.readOffset(m_readBuffer.getReadable()); // // logger() << "write data " << m_writeBuffer.getReadable() << " byte"; // while(m_readBuffer.getReadable() > 0) { // std::shared_ptr data(new TinypbData); // bool ret = m_server.getCoder().decoder(m_readBuffer, *data); // if(ret == false) { // logger() << "decode error"; // break; // } // if(m_connectType == Type::Server) { // std::unique_ptr resp(new TinypbData); // m_server.getDispatcher().dispatcher(*this, *data, *resp); // m_server.getCoder().encoder(m_writeBuffer, *resp); // } else { // std::shared_ptr tmp = std::dynamic_pointer_cast(data); // m_respond_datas[tmp->msg_req] = data; // } // } // } // bool TcpConnection::getResPackageData(const std::string& msg_req, std::shared_ptr& pb_struct) { // auto it = m_respond_datas.find(msg_req); // if(it == m_respond_datas.end()) return false; // pb_struct = it->second; // m_respond_datas.erase(it); // return true; // } // TcpConnection::~TcpConnection() { // if(m_state == State::Connected) { // clearClient(); // } // logger() << "TcpConnection fd " << m_fdEvent->getFd() << " destructor"; // } // }