读/写超过100000条消息时出现boost asio错误
boost asio error when read/write more than 100000 messages
当我读写超过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方法之前,添加一些调试日志记录。在我的应用程序中,我有一个类,可以将它写入控制台和日志文件。
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- boost::asio::steady_timer()与sleep()我应该使用哪一个
- boost::asio如何生成多个协同程序,然后加入它们
- 从 Boost ASIO 获取 epoll 描述符 io_service对象
- 如何在 Boost.Asio 中使用 Zero-copy sendmsg/receive
- 如何使用 Boost Asio 在 Android 上获取我的本地 udp IP 地址?
- 执行时使用 boost::asio::d eadline_timer 时出错
- Boost.Asio/OpenSSL HTTPS GET certificate trouble
- boost::asio data owning `ConstBufferSequence`
- 如何替换此示例代码片段中已弃用的handler_type_t或 boost::asio::handler_type?
- 如何将boost::asio::d eadline_timer 与Qt一起使用?
- 将更高的优先级设置为 boost::asio 线程处理进程
- Async_read_until限制读取的字节大小(Boost::asio)
- 程序崩溃使用boost::asio
- boost::asio 无法捕获 SIGINT
- TCP 服务器的异步读取使用 boost::asio 打印客户端套接字发送的数据
- 如何在 boost::asio 中将打包的结构作为消息传递?(无序列化)
- 如何使用C++和Boost Asio从HTTP发布请求中获取键值
- std::boost::asio::p ost / dispatch 使用哪个io_context?