c++ - Boost Asio 异步 : Server sent message to client

标签 c++ pointers boost buffer

我正在开发服务器/客户端应用程序。客户端向服务器发送消息( header +正文)。服务器收到消息,进行一些修改并发回。

于是客户端发送消息。

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 吗?

最佳答案

如果你有 C++11,你可以像这样复制一个字符串到共享指针:

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

或者通过 boost :

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));

请注意,通常需要发送某种 header ,以便客户端可以找出字符串的长度。因此,您可以将字符串长度复制到 boost::array 并先将其发送给客户端,然后再发送字符串本身。

关于c++ - Boost Asio 异步 : Server sent message to client,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28585406/

相关文章:

c++ - 未调用构造函数

pointers - COBOL中处理不同长度的参数

android - iOS 和 Android 都支持 Boost C++ 线程吗?

c++ - 字符串中的中间字符未被反转 - C++( reshape )

c++ - 为什么我的套接字 connect() 在 WSASetSocketSecurity() 之后失败?

c - C 中的指针类似于数组,但指针更有用

c++ - boost lambda 示例

c++ - 将变量发送到 void 指针或 C++ 中的 void 指针引用

c++ - 迭代有序容器与无序容器

c - 如何在printf中查看结构的地址