tinyrpc/test/tcp_connection.cc

173 lines
5.5 KiB
C++
Raw Normal View History

2025-02-04 16:09:27 +08:00
// #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 <cerrno>
// #include <cstring>
// #include <memory>
// #include <pthread.h>
// #include <unistd.h>
// 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<AbstractData> 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<AbstractData> resp(new TinypbData);
// m_server.getDispatcher().dispatcher(*this, *data, *resp);
// m_server.getCoder().encoder(m_writeBuffer, *resp);
// } else {
// std::shared_ptr<TinypbData> tmp = std::dynamic_pointer_cast<TinypbData>(data);
// m_respond_datas[tmp->msg_req] = data;
// }
// }
// }
// bool TcpConnection::getResPackageData(const std::string& msg_req, std::shared_ptr<AbstractData>& 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";
// }
// }