读/写超过100000条消息时出现boost asio错误

boost asio error when read/write more than 100000 messages

本文关键字:boost asio 错误 消息 100000条      更新时间:2023-10-16

当我读写超过100000条消息时,我在boost::asio::read()handleRead()函数中收到以下异常。

terminate called after throwing an instance of
'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error> >'
what():  asio.ssl error

实施低于

读取功能

void start()
{
boost::asio::async_read(_socket,
boost::asio::buffer(_messageHeader, 8),
    _strand.wrap(
      boost::bind(
        handleRead,
        shared_from_this(),
        boost::asio::placeholders::error,
        boost::asio::placeholders::bytes_transferred
        )
      )
    );
}
void handleRead(const boost::system::error_code& e,
   std::size_t bytesTransferred)
{
  if (!e) 
  {
   BOOST_STATIC_ASSERT( sizeof(MessageHeader) == 8 );
   Message message;
   message.header.fromString(
      std::string(_messageHeader.data(),
        sizeof(MessageHeader)
        )
      );
    boost::asio::read(_socket,
       boost::asio::buffer(_buffer, message.header.length));
   message.body = std::string(_buffer.data(), message.header.length);
   this->start();
  }
  else {
   this->close();
  }
}

已实现消息队列以写入消息

void sendResponse(const Message& response)
{
  std::string stringToSend(response.toString());
  boost::system::error_code error;
  boost::asio::ip::tcp::endpoint endpoint = socket().remote_endpoint(error);
  if ( error ) {
  this->close();
  }
  _strand.post(
     boost::bind(
       writeImpl,
       shared_from_this(),
       stringToSend
       )
    );
}
void writeImpl(const std::string &message)
{
  _outbox.push_back( message );
  if ( _outbox.size() > 1 ) {
    return;
  }
  this->write();
}
void write()
{
 const std::string& message = _outbox[0];
 boost::asio::async_write(
    _socket,
    boost::asio::buffer( message.c_str(), message.size() ),
    _strand.wrap(
      boost::bind(
        writeHandler,
        shared_from_this(),
        boost::asio::placeholders::error,
        boost::asio::placeholders::bytes_transferred
        )
      )
    );
}
void writeHandler(
     const boost::system::error_code& e,
     const size_t bytesTransferred
     )
{
  _outbox.pop_front();
  if ( e ) {
  this->close();
  }
  if ( !_outbox.empty() ) {
   this->write();
 }
}

看起来这是一个客户端应用程序?如果这是一台服务器,那么您可能需要重新考虑在HandleRead中执行的同步读取,并使所有操作都异步。但是,对于一个客户端应用程序或连接很少的服务器来说,这可能是可以的

100000是一个非常有趣的数字——对人来说,而不是对电脑来说。这是一个数字,表明某人在某个地方设置了人为的限制。因此,如果你的应用程序是客户端,请检查服务器代码,以确保它在发送100000条消息后没有关闭套接字连接,反之亦然。也许某个地方有一个大小为100000的硬编码数组,当达到极限时会抛出一个错误,这会产生关闭套接字连接的副作用。

无论您在哪里测试ASIO操作的错误条件,都可以在检测到错误时添加一些日志信息。至少,将一些调试数据写入控制台。例如,在handleRead方法中,在调用close方法之前,添加一些调试日志记录。在我的应用程序中,我有一个类,可以将它写入控制台和日志文件。