/* * ===================================================================================== * * 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; } bool r = Send(dest.ip(), dest.port(), msg.content()); // TODO check send fail. }; local_->Start(1, localProc); auto proxyProc = [this]() { while (run_) { io_context_.run_one_for(std::chrono::milliseconds(100)); } }; return true; } void TcpProxy::Stop() { local_.reset(); bool cur = true; if (run_.compare_exchange_strong(cur, false)) { if (worker_.joinable()) { worker_.join(); } } } bool TcpProxy::Send(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)); // char tag[sizeof(kBHTcpServerTag)] = {0}; // int n = read(sock, tag, sizeof(tag)); // if (n == sizeof(tag) && memcmp(tag, &kBHTcpServerTag, sizeof(tag)) == 0) { // send(sock, content.data(), content.size(), 0); // connections_[addr].io_info_.h_ = [this, sock](int events) { OnReply(sock); }; // // success // } }