/*
|
* =====================================================================================
|
*
|
* 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 <class C>
|
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();
|
}
|
});
|
}
|