Boost Asio异步:服务器已向客户端发送消息
Boost Asio asynchronous: Server sent message to client
我正在开发一个服务器/客户端应用程序。客户端向服务器发送消息(标头+正文)。服务器接收消息,进行一些修改并将其发回。
因此客户端发送消息。
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 ) ;
我想让客户端给我发一条消息,比如"我准备好了",让服务器发回一些信息。在客户端接收到信息后,向客户端发送一条新消息,表明他已经准备好了。因此服务器可以发送下一条信息。尝试了一整天,我只是不知道如何向客户端发送字符串或字符数组。
你能告诉我如何发送字符串或char数组,或者将它们转换为shared_ptr吗?
如果您有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
并首先将其发送到客户端,然后再发送字符串本身。
相关文章:
- 从服务器传输到客户端的消息不会出现
- 如何将 Firebase 与基于 Linux 的客户端应用配合使用,以便与服务器进行双向消息通信
- Kafka C++客户端需要很长时间才能收到消息
- nng to pynng pub/sub. 客户端未收到任何消息
- C++ UDP 服务器在获取客户端地址配置时发送消息
- 如何使用标准库网络 TS 在服务器和客户端之间发送消息C++
- 客户端发送消息,但服务器在客户端结束程序之前不接收消息
- 节点.js到 c++ 客户端:不接收来自 socket.emit 的消息
- Qt WebSockets,如何向客户端发送消息
- 使 gRPC 客户端处于侦听模式,以侦听来自服务器的消息
- 多线程套接字编程服务器仅从 1 个客户端线程获取消息
- 无法使用C#TCP服务器和C TCP客户端接收消息
- 从客户端到浏览器的CEF中的消息传递序列化
- UDP 客户端不会在 esp32 上广播消息
- 带有 TLS v. 1.2 和 SSL v.3 电子邮件客户端的 Boost.Asio 上下文:ssl3 警报意外消息
- Datagram套接字服务器未从客户端接收消息
- 服务器进程等待客户端输入/消息的最佳方法是什么?
- 为什么我的android客户端无法接收到来自winsock c++服务器的字符串消息
- 套接字编程中的客户端到客户端消息传递
- Qt TCP服务器/多客户端消息读取