【问题标题】:Delegate use of boost asio TCP/IP socket委托使用 boost asio TCP/IP 套接字
【发布时间】:2019-02-13 12:52:02
【问题描述】:

我创建了一个 TCP 客户端,它有一个 boost asio tcp 套接字并进行异步读取:

class TCPClient {
 public:
  TCPClient(boost::asio::io_service& io_service)
    : socket_(io_service) {
    // Connect
    [...]
    // Asynchronous read
    socket_.async_read_some(boost::asio::buffer(buffer, buffer.size()),
                            boost::bind(&TCPClient::handlerRead,
                                        this,
                                        placeholders::error,
                                        placeholders::bytes_transferred));
  }
  ~TCPClient() {}

  void handlerRead(const boost::system::error_code& ec, uint32_t bytes) {
    if (!ec) {
      // process
      [...]
      socket_.async_read_some(
        boost::asio::buffer(buffer, buffer.size()),
        boost::bind(&TCPClient::handlerRead,
                    this,
                    placeholders::error,
                    placeholders::bytes_transferred));
  }

  int getSocketFd() {
    return socket_.native_handle();
  }

 private:
  boost::asio::tcp::socket socket_;
};

这工作正常。 但是当我把它放在一个线程中时:

boost::asio::io_service io_service;
auto client = new TCPClient(io_service);
std::thread{[&io_service](){ io_service.run(); }};

...并获取套接字的文件描述符:

int socket_fd = client->getSocketFd();

因为我希望这部分程序使用 TCP/IP 套接字在这个套接字上发送数据包。 但是,我的程序出现了这个错误:

#1  0x000000000041fab0 in boost::asio::detail::task_io_service_operation::complete(boost::asio::detail::task_io_service&, boost::system::error_code const&, unsigned long) ()
#2  0x0000000000420b5f in boost::asio::detail::task_io_service::do_run_one(boost::asio::detail::scoped_lock<boost::asio::detail::posix_mutex>&, boost::asio::detail::task_io_service_thread_info&, boost::system::error_code const&) ()
#3  0x00000000004207df in boost::asio::detail::task_io_service::run(boost::system::error_code&) ()
#4  0x0000000000420eab in boost::asio::io_service::run() ()

你对这里发生的事情有任何线索吗?

【问题讨论】:

  • 你是对的。我是多么愚蠢!

标签: c++ sockets tcp boost-asio


【解决方案1】:

您在一个线程中的堆栈上定义io_service。但是您从不同的线程访问它。在.run() 调用的那一刻,该对象似乎不再存在。

将它移到堆中是一种可能性。无论如何,需要对代码、组件之间的关系和活跃度进行更深入的分析。

【讨论】:

    猜你喜欢
    • 2012-11-10
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2018-06-08
    • 2023-03-13
    • 1970-01-01
    • 2014-01-24
    • 1970-01-01
    相关资源
    最近更新 更多