Я делал простой сервер, используя 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 установлен в конструкторе.
В общем, я хочу отправлять различные данные на основе полученных данных, и я не знаю, как это сделать, и я прошу помощи.
Заранее спасибо!