再次调用async_read会抛出异常
calling async_read again is throwing exception
我有以下代码:
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;
}
}
当HandleRead
被调用并且async_read
被执行时,它抛出一个异常。为了异步等待下一个请求,我们需要再次调用async_read
,对吗?第一次呼叫async_read
成功。
我得到以下异常
我得到以下异常
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
这会使您看起来好像持有一个过时的引用。
此外,boost::asio::buffer(buf)
是一个明显的冒犯,因为buf
是堆栈局部的,但async_read
是…好异步。
常见的模式是
- 使
buf
和socket
类成为成员(这样它们就可以确保比异步请求活得更长) -
使
buf
和socket
共享(boost::shared_ptr<boost::asio::ip::tcp::socket>
),您可以通过值传递/绑定:
根据boost::bind(&GnutellaApp::HandleRead, this, socket )
shared_ptr
,只要绑定函数调用在io服务中保持活动,
将使套接字保持活动状态。
相关文章:
- 从构造函数抛出异常时如何克服内存泄漏
- 函数如何通知用户它基于函数原型抛出异常?
- 在缺少函数重载时抛出异常,并带有 std::variant 而不是编译时错误
- VisualStudios 会抛出异常,而代码块不会 [C++]
- 如果不包含 pthread,为什么 GCC 的线程标准库实现会抛出异常?
- ZMQ::send() 抛出异常并终止 QNX 进程.为什么以及如何从中恢复?
- new(std::nothrow) int[n] 抛出异常
- 为什么g_object_set抛出异常(vcruntime140.dll)?
- 你能防止 std::regex 在无效表达式上抛出异常吗?
- C++子线程抛出异常
- 我们应该在抛出异常之前取消分配内存吗
- 有没有一种方法可以让OpenCLC++绑定为所有错误抛出异常
- 为什么访问模板化变体作为返回值抛出异常
- 如何实现,错误分配中止而不是抛出异常
- std::p riority_queue::p op什么时候会抛出异常
- 在0x5914F3BE抛出异常(基于.dll)
- std::vector 默认构造函数可以抛出异常吗?
- 挂钩创建文件抛出异常:读取访问冲突
- getaddrinfo 抛出异常
- 如果文件为c ,如何抛出异常