/* * ===================================================================================== * * Filename: tcp_connection.cpp * * Description: * * Version: 1.0 * Created: 2021年05月25日 15时34分03秒 * Revision: none * Compiler: gcc * * Author: Li Chao (), lichao@aiotlink.com * Organization: * * ===================================================================================== */ #include "tcp_connection.h" #include "log.h" namespace { template auto Buffer(C &c) { return boost::asio::buffer(c.data(), c.size()); } using boost::asio::async_read; using boost::asio::async_write; } // namespace TcpRequest1::TcpRequest1(boost::asio::io_context &io, tcp::endpoint const &addr, std::string request) : socket_(io), remote_(addr), request_(std::move(request)) {} void TcpRequest1::Connect() { auto self = shared_from_this(); socket_.async_connect(remote_, [this, self](bserror_t ec) { if (!ec) { SendRequest(); } else { LOG_ERROR() << "connect error " << ec; Close(); } }); } void TcpRequest1::Close() { socket_.close(); } void TcpRequest1::SendRequest() { LOG_INFO() << "client sending request " << request_; auto self = shared_from_this(); async_write(socket_, Buffer(request_), [this, self](bserror_t ec, size_t) { if (!ec) { ReadReply(); } else { Close(); } }); } void TcpRequest1::ReadReply() { buffer_.resize(1000); auto self = shared_from_this(); socket_.async_read_some(Buffer(buffer_), [this, self](bserror_t ec, size_t size) { if (!ec) { printf("reply data: %s\n", buffer_.data()); } else { Close(); } }); } TcpReply1::TcpReply1(tcp::socket sock) : socket_(std::move(sock)) {} void TcpReply1::Start() { LOG_INFO() << "server session reading..."; recv_buffer_.resize(1000); auto self(shared_from_this()); socket_.async_read_some(Buffer(recv_buffer_), [this, self](bserror_t ec, size_t size) { LOG_INFO() << "server read : " << recv_buffer_.data(); // fake reply if (!ec) { send_buffer_ = std::string(recv_buffer_.data(), size) + " reply"; async_write(socket_, Buffer(send_buffer_), [this, self](bserror_t ec, size_t size) { socket_.close(); }); } else { socket_.close(); } }); }