首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >boost asio TCP/IP套接字的委派使用

boost asio TCP/IP套接字的委派使用
EN

Stack Overflow用户
提问于 2019-02-13 20:52:03
回答 1查看 133关注 0票数 0

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

代码语言:javascript
运行
复制
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_;
};

这工作得很好。但是当我把这个放到一个线程中时:

代码语言:javascript
运行
复制
boost::asio::io_service io_service;
auto client = new TCPClient(io_service);
std::thread{[&io_service](){ io_service.run(); }};

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

代码语言:javascript
运行
复制
int socket_fd = client->getSocketFd();

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

代码语言:javascript
运行
复制
#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() ()

你对这里发生的事情有什么线索吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-13 21:25:29

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54670668

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档