简体   繁体   English

提升Asio tcp :: acceptor访问冲突异常

[英]Boost Asio tcp::acceptor access violation exception

I'm trying to create a tcp::acceptor and a libtorrent::session side by side, but I get an access violation exception when waiting for input from std::cin . 我正在尝试并排创建一个tcp::acceptor和一个libtorrent::session ,但是在等待std::cin输入时我遇到了访问冲突异常。 The access violation occurs in the Boost IOCP implementation as shown by the stack trace. 访问冲突发生在Boost IOCP实现中,如堆栈跟踪所示。

  • Windows 8.1 Windows 8.1
  • MSVC 12.0 (Visual Studio 2013) MSVC 12.0(Visual Studio 2013)
  • boost v1.57.0 提升v1.57.0
  • libtorrent-rasterbar v1.0.3 libtorrent-rasterbar v1.0.3

A minimal example which lets me reproduce the issue, 一个让我重现问题的最小例子,

#include <boost/asio.hpp>
#include <libtorrent/session.hpp>

int main(int argc, char *argv[])
{
    boost::asio::io_service io_service;
    boost::asio::ip::tcp::acceptor acceptor(io_service);

    libtorrent::session s;

    std::string line;
    std::getline(std::cin, line); // <----- trigger

    return 0;
}

The stack trace is 堆栈跟踪是

lt_test.exe!boost::asio::detail::win_iocp_socket_service_base::do_open(boost::asio::detail::win_iocp_socket_service_base::base_implementation_type & impl, int family, int type, int protocol, boost::system::error_code & ec) Line 300   C++
lt_test.exe!boost::asio::detail::win_iocp_socket_service<boost::asio::ip::tcp>::open(boost::asio::detail::win_iocp_socket_service<boost::asio::ip::tcp>::implementation_type & impl, const boost::asio::ip::tcp & protocol, boost::system::error_code & ec) Line 192  C++
lt_test.exe!boost::asio::socket_acceptor_service<boost::asio::ip::tcp>::open(boost::asio::detail::win_iocp_socket_service<boost::asio::ip::tcp>::implementation_type & impl, const boost::asio::ip::tcp & protocol, boost::system::error_code & ec) Line 144  C++
lt_test.exe!boost::asio::basic_socket_acceptor<boost::asio::ip::tcp,boost::asio::socket_acceptor_service<boost::asio::ip::tcp> >::open(const boost::asio::ip::tcp & protocol, boost::system::error_code & ec) Line 310    C++
lt_test.exe!libtorrent::aux::session_impl::setup_listener(libtorrent::listen_socket_t * s, boost::asio::ip::basic_endpoint<boost::asio::ip::tcp> ep, int & retries, bool v6_only, int flags, boost::system::error_code & ec) Line 2089    C++
lt_test.exe!libtorrent::aux::session_impl::open_listen_port(int flags, boost::system::error_code & ec) Line 2243  C++
lt_test.exe!libtorrent::aux::session_impl::init() Line 1258   C++
lt_test.exe!libtorrent::aux::session_impl::main_thread() Line 4880    C++
lt_test.exe!boost::_mfi::mf0<void,libtorrent::aux::session_impl>::operator()(libtorrent::aux::session_impl * p) Line 50   C++
lt_test.exe!boost::_bi::list1<boost::_bi::value<libtorrent::aux::session_impl *> >::operator()<boost::_mfi::mf0<void,libtorrent::aux::session_impl>,boost::_bi::list0>(boost::_bi::type<void> __formal, boost::_mfi::mf0<void,libtorrent::aux::session_impl> & f, boost::_bi::list0 & a, int __formal) Line 254   C++
lt_test.exe!boost::_bi::bind_t<void,boost::_mfi::mf0<void,libtorrent::aux::session_impl>,boost::_bi::list1<boost::_bi::value<libtorrent::aux::session_impl *> > >::operator()() Line 21   C++
lt_test.exe!boost::asio::detail::win_thread::func<boost::_bi::bind_t<void,boost::_mfi::mf0<void,libtorrent::aux::session_impl>,boost::_bi::list1<boost::_bi::value<libtorrent::aux::session_impl *> > > >::run() Line 117 C++
lt_test.exe!boost::asio::detail::win_thread_function(void * arg) Line 118 C++
[External Code] 
[Frames below may be incorrect and/or missing, no symbols loaded for kernel32.dll]  

Removing the acceptor makes the access violation exception disappear. 删除acceptor会使访问冲突异常消失。

What causes this? 是什么导致这个?

I ran into the same problem. 我遇到了同样的问题。 I was helped by adding BOOST_ASIO_ENABLE_CANCELIO in preprocessor definitions. 通过在预处理器定义中添加BOOST_ASIO_ENABLE_CANCELIO来帮助我。 Here you can find more information. 在这里您可以找到更多信息。

I have run into the same issue, I had nothing wrong in my code, indeed using another constructor of acceptor worker fine, this was crashing to me: 我遇到了同样的问题,我的代码中没有任何错误,确实使用了另一个接受器工作者的构造函数,这对我来说是崩溃的:

this->acceptor = boost::make_shared<boost::asio::ip::tcp::acceptor>(io_service_, endpoint);

whereas this was not 而事实并非如此

this->acceptor = boost::make_shared<boost::asio::ip::tcp::acceptor>(io_service_, endpoint.protocol());

notice the protocol() call, I am using another constructor, surprisingly this worked ... 注意protocol()调用,我正在使用另一个构造函数,令人惊讶的是这个工作...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM