2015-02-18 2 views
1

Я работаю над приложением 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?

+0

До сих пор я мог только дать значения буфера shared_ptr только с буфером. boost :: array Buf и for (int i = 0; i <256; i ++) Buf [i] = '9'; ((* sendBuffer) [i]) = Buf [i]; любые другие способы? –

ответ

0

Вы можете скопировать строку в общий указатель, как это, если у вас есть C++ 11:

auto shared_string = std::make_shared<std::string>(string_to_send); 

Или с повышением:

boost::shared_ptr<std::string> ptr = boost::make_shared<std::string>(string_to_send); 

И чем отправить его в гнездо:

async_write(m_socket, boost::asio::buffer(*shared_string), m_strand.wrap(boost::bind(&ASyncConnectionMT::HandleSent, shared_from_this() , shared_string, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); 

Обратите внимание, что обычно требуется отправить какой-либо заголовок, чтобы клиент мог узнать длину строки. Таким образом, вы можете скопировать длину строки до boost::array и сначала отправить ее клиенту, а затем, например, отправить строку.