/* * ===================================================================================== * * Filename: tcp_proxy.cpp * * Description: * * Version: 1.0 * Created: 2021年05月19日 15时04分15秒 * Revision: none * Compiler: gcc * * Author: Li Chao (), lichao@aiotlink.com * Organization: * * ===================================================================================== */ #include "tcp_proxy.h" #include "defs.h" #include "shm_socket.h" #include "tcp_connection.h" TcpProxy::TcpProxy() : run_(false) {} TcpProxy::~TcpProxy() {} bool TcpProxy::Start(bhome_shm::SharedMemory &shm) { Stop(); bool cur = false; if (!run_.compare_exchange_strong(cur, true)) { return false; } auto &mq = GetCenterInfo(shm)->mq_tcp_proxy_; local_.reset(new ShmSocket(mq.offset_, shm, mq.id_)); auto localProc = [this](ShmSocket &sock, MsgI &msg, BHMsgHead &head) { auto &dest = head.dest(); if (dest.ip().empty() || dest.port() == 0) { return; } Request(dest.ip(), dest.port(), msg.content()); }; local_->Start(1, localProc); auto proxyProc = [this]() { while (run_) { io_context_.run_one_for(std::chrono::milliseconds(100)); } }; std::thread(proxyProc).swap(worker_); return true; } void TcpProxy::Stop() { bool cur = true; if (run_.compare_exchange_strong(cur, false)) { if (worker_.joinable()) { worker_.join(); } local_.reset(); } } bool TcpProxy::Request(const std::string &ip, int port, std::string &&content) { if (content.empty()) { return false; } tcp::endpoint dest(ip::address::from_string(ip), port); TcpRequest1::Create(io_context_, dest, std::move(content), *local_); }