Я работаю над приложением Server/Client. Клиент отправляет на сервер сообщение (заголовок + тело). Сервер получает сообщение, вносит некоторые изменения и отправляет его обратно.Boost Asio асинхронный: сервер отправил сообщение клиенту
Таким образом, клиент отправляет сообщение.
async_write (m_socket,boost::asio::buffer(msg -> HeaderData() , msg -> SendLength()),
boost::bind (&Client::HandleSentMessage , this ,
boost::asio::placeholders::error , boost::asio::placeholders::bytes_transferred));
Сервер получает сообщение.
m_socket.async_read_some (boost::asio::buffer (*receiveBuffer) , boost::bind(
&ASyncConnectionMT::HandleReceived , shared_from_this() , receiveBuffer ,
boost::asio::placeholders::error , boost::asio::placeholders::bytes_transferred));
Он идет к моей функции:
void HandleReceived (BufferPtr receiveBuffer , const boost::system::error_code& ec , size_t size)
И он изменяет полученное сообщение.
for (size_t i=0 ; i!=size ; i++)
{
((*sendBuffer)[i]) = toupper((*receiveBuffer)[i]);
}
И отправляет его обратно.
async_write (m_socket, boost::asio::buffer (*sendBuffer , size) , m_strand.wrap(
boost::bind (&ASyncConnectionMT::HandleSent ,shared_from_this() , sendBuffer,
boost::asio::placeholders::error,boost::asio::placeholders::bytes_transferred));
Пока все хорошо. Код работает безупречно. Но в чем моя проблема. Я получаю сообщение отправки и изменяю его, но, скажем, например, я хочу отправить что-то еще. Например, строка.
Проблема в том, что я должен передать буфер как shared_ptr
, поэтому мой объект не будет уничтожен после выхода из этой функции.
typedef boost::array < char , 65536 > Buffer;
typedef boost::shared_ptr <Buffer> BufferPtr;
BufferPtr receiveBuffer (new Buffer) ;
BufferPtr sendBuffer (new Buffer) ;
Я хочу, чтобы клиент послал мне сообщение типа «Я готов» и сервер, чтобы отправить некоторую информацию. После получения клиентом информации, чтобы отправить клиенту новое сообщение о том, что он готов. Таким образом, сервер может отправить следующую информацию. Пробовал весь день, я просто не могу понять, как отправить строку или массив символов клиенту.
Можете ли вы показать мне, как отправить строку или массив символов или преобразовать их в shared_ptr?
До сих пор я мог только дать значения буфера shared_ptr только с буфером. boost :: array Buf и for (int i = 0; i <256; i ++) Buf [i] = '9'; ((* sendBuffer) [i]) = Buf [i]; любые другие способы? –