| | |
| | | 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. |
| | | Request(dest.ip(), dest.port(), msg.content()); |
| | | }; |
| | | local_->Start(1, localProc); |
| | | |
| | |
| | | io_context_.run_one_for(std::chrono::milliseconds(100)); |
| | | } |
| | | }; |
| | | std::thread(proxyProc).swap(worker_); |
| | | return true; |
| | | } |
| | | |
| | | void TcpProxy::Stop() |
| | | { |
| | | local_.reset(); |
| | | |
| | | bool cur = true; |
| | | if (run_.compare_exchange_strong(cur, false)) { |
| | | if (worker_.joinable()) { |
| | | worker_.join(); |
| | | } |
| | | local_.reset(); |
| | | } |
| | | } |
| | | |
| | | bool TcpProxy::Send(const std::string &ip, int port, std::string &&content) |
| | | 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)); |
| | | |
| | | // 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 |
| | | // } |
| | | TcpRequest1::Create(io_context_, dest, std::move(content), *local_); |
| | | } |