调用async_read再次抛出异常 [英] calling async_read again is throwing exception

查看:198
本文介绍了调用async_read再次抛出异常的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下的code:

 无效GnutellaApp :: HandleRead(提高:: ASIO ::知识产权:: TCP ::插座及放大器;插座)
{
     CHAR BUF [128];
     尝试{
     提高:: ASIO :: async_read(插座,
                                提高:: ASIO ::缓​​冲区(BUF)
                                提高:: ASIO :: transfer_all()
                                提高::绑定(安培; GnutellaApp :: HandleRead,
                                            这个,
                                            的boost :: REF(插座)
                                            )
                            );
     }
        赶上(升压::系统:: SYSTEM_ERROR常量与评估)
        {
            性病::法院LT&;< 警告:<< e.what()&所述;&下;的std :: ENDL;
        }
}

HandleRead 被调用,执行 async_read ,它抛出一个异常。为了异步地等待下一次我们需要调用请求的 async_read 再次,对不对?
首先调用 async_read 成功。

我得到以下异常

我收到以下异常

  Gnutella.exe!的std :: _ Ref_count_base :: _ Incwref()线113 C ++
    !Gnutella.exe的std :: _ Ptr_base<无效> :: _ Resetw<无效>(无效* _Other_ptr,性病:: _ Ref_count_base * _Other_rep)线458 C ++
    !Gnutella.exe的std :: _ Ptr_base<无效> :: _ Resetw<无效>(常量的std :: _ Ptr_base<无效>&安培; _其他)线445 C ++
    Gnutella.exe的std :: weak_ptr的<!无效> :: weak_ptr的<无效><无效>(常量的std :: shared_ptr的<无效>&放大器; _其他的,无效* __formal)线994 C ++
    Gnutella.exe!boost::asio::detail::win_iocp_socket_service_base::async_receive<boost::asio::mutable_buffers_1,boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> >,boost::asio::mutable_buffers_1,boost::asio::detail::transfer_all_t,boost::_bi::bind_t<void,boost::_mfi::mf1<void,GnutellaApp,boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> &GT; &安培;&GT;,提振:: _双::列表2&LT;提高:: _双::值&LT; GnutellaApp *>,boost::reference_wrapper<boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> &GT; &GT; &GT; &GT; &GT; &GT;(提高:: ASIO ::详细:: win_iocp_socket_service_base :: base_implementation_type&放大器; implement执行,常量的boost ::支持ASIO :: mutable_buffers_1&放大器;缓冲区,诠释旗帜, boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> >,boost::asio::mutable_buffers_1,boost::asio::detail::transfer_all_t,boost::_bi::bind_t<void,boost::_mfi::mf1<void,GnutellaApp,boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> &GT;&安培;&GT;,提振:: _双::列表2&LT;提高:: _双::值&LT; GnutellaApp *>,boost::reference_wrapper<boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> &GT;&GT;&GT;&GT;&GT;&安培;处理)线292 C ++
    Gnutella.exe!boost::asio::stream_socket_service<boost::asio::ip::tcp>::async_receive<boost::asio::mutable_buffers_1,boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> >,boost::asio::mutable_buffers_1,boost::asio::detail::transfer_all_t,boost::_bi::bind_t<void,boost::_mfi::mf1<void,GnutellaApp,boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> &GT; &安培;&GT;,提振:: _双::列表2&LT;提高:: _双::值&LT; GnutellaApp *>,boost::reference_wrapper<boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> &GT; &GT; &GT; &GT; &GT; &GT;(提高:: ASIO ::详细:: win_iocp_socket_service&LT;提高:: ASIO ::知识产权:: TCP&GT; :: implementation_type&放大器; implement执行,常量的boost ::支持ASIO :: mutable_buffers_1&放大器;缓冲区,诠释旗帜, boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> >,boost::asio::mutable_buffers_1,boost::asio::detail::transfer_all_t,boost::_bi::bind_t<void,boost::_mfi::mf1<void,GnutellaApp,boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> &GT;&安培;&GT;,提振:: _双::列表2&LT;提高:: _双::值&LT; GnutellaApp *>,boost::reference_wrapper<boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> &GT;&GT;&GT;&GT;&GT;&放大器;&安培;处理)线359 C ++
    Gnutella.exe!boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> >::async_read_some<boost::asio::mutable_buffers_1,boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> >,boost::asio::mutable_buffers_1,boost::asio::detail::transfer_all_t,boost::_bi::bind_t<void,boost::_mfi::mf1<void,GnutellaApp,boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> &GT; &安培;&GT;,提振:: _双::列表2&LT;提高:: _双::值&LT; GnutellaApp *>,boost::reference_wrapper<boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> &GT; &GT; &GT; &GT; &GT; &GT;(常量的boost ::支持ASIO :: mutable_buffers_1&放大器;缓冲器, boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> >,boost::asio::mutable_buffers_1,boost::asio::detail::transfer_all_t,boost::_bi::bind_t<void,boost::_mfi::mf1<void,GnutellaApp,boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> &GT;&安培;&GT;,提振:: _双::列表2&LT;提高:: _双::值&LT; GnutellaApp *>,boost::reference_wrapper<boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> &GT;&GT;&GT;&GT;&GT;&放大器;&安培;处理)线846 C ++
    Gnutella.exe!boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> >,boost::asio::mutable_buffers_1,boost::asio::detail::transfer_all_t,boost::_bi::bind_t<void,boost::_mfi::mf1<void,GnutellaApp,boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> &GT; &安培;&GT;,提振:: _双::列表2&LT;提高:: _双::值&LT; GnutellaApp *>,boost::reference_wrapper<boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> &GT; &GT; &GT; &GT; &GT; ::运算符()(常量的boost ::系统::错误_ code和; EC,无符号整型bytes_transferred,INT启动)线273 C ++
    Gnutella.exe!boost::asio::async_read<boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> >,boost::asio::mutable_buffers_1,boost::asio::detail::transfer_all_t,boost::_bi::bind_t<void,boost::_mfi::mf1<void,GnutellaApp,boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> &GT; &安培;&GT;,提振:: _双::列表2&LT;提高:: _双::值&LT; GnutellaApp *>,boost::reference_wrapper<boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> &GT; &GT; &GT; &GT; >(boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> &GT; &安培; S,常量的boost ::支持ASIO :: mutable_buffers_1&安培;缓冲区,提高:: ASIO ::详细:: transfer_all_t completion_condition, boost::_bi::bind_t<void,boost::_mfi::mf1<void,GnutellaApp,boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> &GT; &安培;&GT;,提振:: _双::列表2&LT;提高:: _双::值&LT; GnutellaApp *>,boost::reference_wrapper<boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> &GT; &GT; &GT; &GT; &功放;&安培;处理)线535 C ++
    Gnutella.exe!GnutellaApp::HandleRead(boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> &GT; &安培;插座)线232 C ++
&GT; Gnutella.exe!boost::_mfi::mf1<void,GnutellaApp,boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> &GT; &安培;&GT; ::运算符()(GnutellaApp * P, boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> &GT;&安培; A1)线165 C ++
    !Gnutella.exe提振:: _双::列表2&LT;提高:: _双向::值


解决方案

这将是如果你是抱着过时的基准出现。

此外,提高:: ASIO ::缓​​冲区(BUF)是一个明显的违法行为,因为 BUF 是一个堆栈的局部,但 async_read ...嗯 异步

常见的模式是


  • BUF 插座类成员(因此他们肯定会活得比异步请求)

  • BUF 插座共享(的boost :: shared_ptr的&LT;升压:: ASIO ::知识产权:: TCP ::插座&GT; ),你可以只通过/绑定按值:

     的boost ::绑定(安培; GnutellaApp :: HandleRead,
                    这个,
                    插座
                 )

    将只会插座活着,只要绑定的函数调用在IO服务保持活力,凭借的shared_ptr


I have the following code:

 void GnutellaApp::HandleRead (boost::asio::ip::tcp::socket& socket)
{
     char buf[128];
     try {
     boost::asio::async_read(   socket,
                                boost::asio::buffer(buf),
                                boost::asio::transfer_all(),
                                boost::bind(&GnutellaApp::HandleRead,
                                            this,
                                            boost::ref(socket)
                                            )
                            );
     }
        catch (boost::system::system_error const& e)
        {
            std::cout << "Warning:  " << e.what() << std::endl;
        }
}

When HandleRead is called and async_read is executed, its throwing an exception. In order to asynchronously wait for next request we need to call async_read again, right? First call to async_read succeeds.

i am getting following exception

I am getting following exception

Gnutella.exe!std::_Ref_count_base::_Incwref() Line 113  C++
    Gnutella.exe!std::_Ptr_base<void>::_Resetw<void>(void * _Other_ptr, std::_Ref_count_base * _Other_rep) Line 458 C++
    Gnutella.exe!std::_Ptr_base<void>::_Resetw<void>(const std::_Ptr_base<void> & _Other) Line 445  C++
    Gnutella.exe!std::weak_ptr<void>::weak_ptr<void><void>(const std::shared_ptr<void> & _Other, void * * __formal) Line 994    C++
    Gnutella.exe!boost::asio::detail::win_iocp_socket_service_base::async_receive<boost::asio::mutable_buffers_1,boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> >,boost::asio::mutable_buffers_1,boost::asio::detail::transfer_all_t,boost::_bi::bind_t<void,boost::_mfi::mf1<void,GnutellaApp,boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> > &>,boost::_bi::list2<boost::_bi::value<GnutellaApp *>,boost::reference_wrapper<boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> > > > > > >(boost::asio::detail::win_iocp_socket_service_base::base_implementation_type & impl, const boost::asio::mutable_buffers_1 & buffers, int flags, boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> >,boost::asio::mutable_buffers_1,boost::asio::detail::transfer_all_t,boost::_bi::bind_t<void,boost::_mfi::mf1<void,GnutellaApp,boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> > &>,boost::_bi::list2<boost::_bi::value<GnutellaApp *>,boost::reference_wrapper<boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> > > > > > & handler) Line 292   C++
    Gnutella.exe!boost::asio::stream_socket_service<boost::asio::ip::tcp>::async_receive<boost::asio::mutable_buffers_1,boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> >,boost::asio::mutable_buffers_1,boost::asio::detail::transfer_all_t,boost::_bi::bind_t<void,boost::_mfi::mf1<void,GnutellaApp,boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> > &>,boost::_bi::list2<boost::_bi::value<GnutellaApp *>,boost::reference_wrapper<boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> > > > > > >(boost::asio::detail::win_iocp_socket_service<boost::asio::ip::tcp>::implementation_type & impl, const boost::asio::mutable_buffers_1 & buffers, int flags, boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> >,boost::asio::mutable_buffers_1,boost::asio::detail::transfer_all_t,boost::_bi::bind_t<void,boost::_mfi::mf1<void,GnutellaApp,boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> > &>,boost::_bi::list2<boost::_bi::value<GnutellaApp *>,boost::reference_wrapper<boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> > > > > > && handler) Line 359   C++
    Gnutella.exe!boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> >::async_read_some<boost::asio::mutable_buffers_1,boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> >,boost::asio::mutable_buffers_1,boost::asio::detail::transfer_all_t,boost::_bi::bind_t<void,boost::_mfi::mf1<void,GnutellaApp,boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> > &>,boost::_bi::list2<boost::_bi::value<GnutellaApp *>,boost::reference_wrapper<boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> > > > > > >(const boost::asio::mutable_buffers_1 & buffers, boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> >,boost::asio::mutable_buffers_1,boost::asio::detail::transfer_all_t,boost::_bi::bind_t<void,boost::_mfi::mf1<void,GnutellaApp,boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> > &>,boost::_bi::list2<boost::_bi::value<GnutellaApp *>,boost::reference_wrapper<boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> > > > > > && handler) Line 846    C++
    Gnutella.exe!boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> >,boost::asio::mutable_buffers_1,boost::asio::detail::transfer_all_t,boost::_bi::bind_t<void,boost::_mfi::mf1<void,GnutellaApp,boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> > &>,boost::_bi::list2<boost::_bi::value<GnutellaApp *>,boost::reference_wrapper<boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> > > > > >::operator()(const boost::system::error_code & ec, unsigned int bytes_transferred, int start) Line 273  C++
    Gnutella.exe!boost::asio::async_read<boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> >,boost::asio::mutable_buffers_1,boost::asio::detail::transfer_all_t,boost::_bi::bind_t<void,boost::_mfi::mf1<void,GnutellaApp,boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> > &>,boost::_bi::list2<boost::_bi::value<GnutellaApp *>,boost::reference_wrapper<boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> > > > > >(boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> > & s, const boost::asio::mutable_buffers_1 & buffers, boost::asio::detail::transfer_all_t completion_condition, boost::_bi::bind_t<void,boost::_mfi::mf1<void,GnutellaApp,boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> > &>,boost::_bi::list2<boost::_bi::value<GnutellaApp *>,boost::reference_wrapper<boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> > > > > && handler) Line 535   C++
    Gnutella.exe!GnutellaApp::HandleRead(boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> > & socket) Line 232    C++
>   Gnutella.exe!boost::_mfi::mf1<void,GnutellaApp,boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> > &>::operator()(GnutellaApp * p, boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> > & a1) Line 165 C++
    Gnutella.exe!boost::_bi::list2<boost::_bi::value

解决方案

It would appear as if you are holding a stale reference.

Besides, boost::asio::buffer(buf) is a glaring offense, since buf is a stack-local, but async_read is... well async.

The common patterns are

  • make buf and socket class members (so that they are sure to outlive the async requests)
  • make buf and socket shared (boost::shared_ptr<boost::asio::ip::tcp::socket>) which you can just pass/bind by value:

       boost::bind(&GnutellaApp::HandleRead,
                    this,
                    socket
                 )
    

    would just keep the socket alive as long as the bound function call is kept alive in the io service, by virtue of the shared_ptr

这篇关于调用async_read再次抛出异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆