22#include <boost/bind/bind.hpp>
25#include "platform/proto/replica_info.pb.h"
30 const std::string& ip,
int port,
31 bool is_use_long_conn)
32 : socket_(*io_service),
33 endpoint_(boost::asio::ip::address::from_string(ip), port),
39 queue_.
Push(std::make_unique<std::string>(
data));
40 if (!in_process_.load()) {
41 bool old_value =
false;
42 if (in_process_.compare_exchange_strong(old_value,
true,
43 std::memory_order_acq_rel,
44 std::memory_order_acq_rel)) {
51void AsyncReplicaClient::OnSendNewMessage() {
52 std::unique_ptr<std::string>
data = queue_.
Pop(0);
53 if (
data ==
nullptr ||
data->empty()) {
57 pending_data_ = std::move(
data);
62void AsyncReplicaClient::OnSendMessage() {
64 data_size_ = pending_data_->size();
65 sending_data_size_ =
sizeof(data_size_);
66 sending_data_ptr_ =
reinterpret_cast<char*
>(&data_size_);
67 sending_data_idx_ = 0;
70 }
else if (status_ == 1) {
71 sending_data_size_ = data_size_;
72 sending_data_ptr_ = pending_data_->c_str();
73 sending_data_idx_ = 0;
82void AsyncReplicaClient::OnSend() {
83 socket_.async_write_some(
84 boost::asio::buffer(sending_data_ptr_ + sending_data_idx_,
85 sending_data_size_ - sending_data_idx_),
86 [&](
const boost::system::error_code& error,
size_t send_size) {
90 sending_data_idx_ += send_size;
91 if (sending_data_idx_ >= sending_data_size_) {
100void AsyncReplicaClient::ReConnect() {
101 socket_.async_connect(endpoint_, [&](
const boost::system::error_code& error) {
virtual int SendMessage(const std::string &data)
AsyncReplicaClient(boost::asio::io_service *io_service, const std::string &ip, int port, bool is_use_long_conn=false)
virtual ~AsyncReplicaClient()
void Push(std::unique_ptr< T > data)
std::unique_ptr< T > Pop(int timeout_ms=100)