我可以在两个不同的类实例中增强asio套接字引用吗?

时间:2016-05-25 17:50:54

标签: c++ sockets boost boost-asio move

我想std::move(my_asio_socket)到某个类的实例。如果我对其他类的实例执行相同操作该怎么办?

我的目的是在一个类实例中read_async(让我们说类A),并在另一个类实例中执行write_async(比如说​​类B)。由于某些功能实现,我应该这样做。

任何建议都会很好。

更新

它没有像我预期的那样正常工作 VS2015(vc14编译器)在调试时向我显示了一种异常:

Microsoft C++ exception: boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error> > at memory location 0x02D8E3BC.

在VS中点击continue之后,它向我显示:

Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.

正如我所说,我正在尝试boost::move(或std::move)套接字到其他类实例。以下是我正在做的代码片段:

boost::shared_ptr<connection> new_connection_;//it's a field in my class,
//that's why i should reset it later
new_connection_.reset(new connection(std::move(socket_), io_service_));
new_connection_->start();

现在这是我的connection ctor:

    connection::connection(boost::asio::ip::tcp::socket sock, boost::asio::io_service& io_ptr)
    : socket_(boost::move(sock)),
      io_ptr_(io_ptr),
      remote_ep(socket_.remote_endpoint()),
      //request_handler_(new request_handler(boost::move(socket_))),
      work(new boost::asio::io_service::work(io_ptr))
    {
      boost::shared_ptr<request_handler> req_ptr(new request_handler(boost::move(socket_)));
      request_handler_.swap(req_ptr);
    }

正如您所看到的,我已尝试在注释行中初始化,但它显示了相同的结果。
以下是request_handler的代码:

    request_handler::request_handler(boost::asio::ip::tcp::socket sock):
                                           socket_(boost::move(sock)){ }

这是问题检测到的方法connection::start

void connection::start()
{
    boost::asio::ip::tcp::socket::keep_alive kl(true);
    boost::asio::ip::tcp::socket::enable_connection_aborted eca(true);
    // here it breaks, when trying to set an option
    socket_.set_option(eca);
    socket_.set_option(kl);

    socket_.async_read_some(boost::asio::buffer(buffer_),
        boost::bind(&connection::handle_read, shared_from_this(),
            boost::asio::placeholders::error,
            boost::asio::placeholders::bytes_transferred));
}

仅当我使用socket移动到request_handler的新实例时才会出现此问题。如果我不是 - 那么一切都好转。我无法理解它可能是什么原因,但似乎我的socket_(我声明它在没有任何&*的任何地方来自connection类的字段丢失或的种类。但调试器并没有向我显示像null这样的东西,所以我不知道它是什么。

1 个答案:

答案 0 :(得分:1)

In general无法保证:

  

通常移动分配操作员&#34;窃取&#34;参数所拥有的资源(例如指向动态分配的对象,文件描述符,TCP套接字,I / O流,运行线程等),而不是复制它们,并将参数保留为某些有效但不确定的参数州。例如,从std :: string或std :: vector中移动赋值可能会导致参数保留为空。但是,不应该依赖这种行为。

但是根据tcp::socket的文档,它保持相同的状态:

  

移动后,移动的对象处于与使用basic_stream_socket(io_service&amp;)构造函数构造的状态相同的状态。