Как сделать аргумент данных async_write_some () в буфере динамически c с C ++ boost :: asio? - PullRequest
0 голосов
/ 07 марта 2020

Я делал простой сервер, используя boost :: asio. Я использовал документы Boost для создания основ и столкнулся с проблемой: я хочу, чтобы клиент мог отправлять серверу команду, поэтому я хочу, чтобы сервер мог отвечать на это. Я использую async_write_some () и async_read_some (), как показано в документации.
Я использую член m_Data для хранения всего, что клиент отправил на сервер, но я не знаю, как заставить async_write_some () отправлять определенную вещь .

Connection.hpp

using namespace boost::asio;

class Connection : public boost::enable_shared_from_this<Connection> {
    private:
        ip::tcp::socket m_Socket;
        std::string     m_Msg;
        uint16_t        m_MaxLen;
        char*           m_Data;

    public:
        Connection(boost::asio::io_service& _ioSrvc);

        static boost::shared_ptr<Connection> Create(boost::asio::io_service& _ioSrvc);
        ip::tcp::socket&                     Socket();

        void Start();

        void HandleRead(const boost::system::error_code& _err, size_t _bytes);
        void HandleWrite(const boost::system::error_code& _err, size_t _bytes);
};

Соединение. cpp

Connection::Connection(boost::asio::io_service& _ioSrvc)
    : m_Socket(_ioSrvc), m_Msg("placeholder_message"), m_MaxLen(1024), m_Data(new char[m_MaxLen]) { }

boost::shared_ptr<Connection> Connection::Create(boost::asio::io_service& _ioSrvc) {
    return boost::shared_ptr<Connection>(new Connection(_ioSrvc));
}

ip::tcp::socket& Connection::Socket() {
    return m_Socket;
}

void Connection::Start() {
    m_Socket.async_read_some(boost::asio::buffer(m_Data, m_MaxLen),
                             boost::bind(&Connection::HandleRead, shared_from_this(), boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));

    m_Socket.async_write_some(boost::asio::buffer(m_Msg, m_MaxLen),
                              boost::bind(&Connection::HandleWrite, shared_from_this(), boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));

}

void Connection::HandleRead(const boost::system::error_code& _err, size_t _bytes) {
    if (!_err) {
        std::cout << m_Data << std::endl;
    }
    else {
        std::cerr << "[ERROR]: " << _err.message() << std::endl;
        m_Socket.close();
    }
}

void Connection::HandleWrite(const boost::system::error_code& _err, size_t _bytes) {
    if (!_err) {
        std::cout << "!" << std::endl;
    }
    else {
        std::cerr << "[ERROR]: " << _err.message() << std::endl;
        m_Socket.close();
    }
}

Я знаю, что это занимает буфер, который принимает ссылку на строку, поэтому я Я подумал, что изменение исходной строки, которая является членом m_Msg, приведет к тому, что сервер сможет динамически изменять ответ на все, что я хотел, но это не сработало, похоже, что буфер взял копию вместо ссылки, хотя я я уверен, что видел в нем std :: string & arg. Я попытался изменить член m_Msg в методе HandleRead (), используя метод outside и многие другие вещи, но у меня ничего не получалось, клиент всегда заканчивал тем, что получал "placeholder_message", для которого m_Msg установлен в конструкторе.

В общем, я хочу отправлять различные данные на основе полученных данных, и я не знаю, как это сделать, и я прошу помощи.
Заранее спасибо!

...