当服务停止并重新启动时,打开的asio tcp套接字会发生什么?

时间:2017-06-16 17:06:52

标签: c++ boost-asio asio

短版本:如果我在ioserive中运行一个打开的tcp套接字,如果我停止服务会发生什么?数据是否应继续在tcp套接字中排队(假设服务器继续发送数据并且没有断开连接)?如果是这样,我可以通过重置和重新启动ioserive来检索该数据吗?



长版本:我正在尝试在基于asio的tcp套接字API上添加一个阻塞界面。

用户最初使用API​​打开套接字连接到服务器。

对于每个后续的API调用,ioservice都会被重置并启动,然后使用带有boost :: asio :: write的tcp套接字将数据发送到服务器,并等待响应。使用async_read_until处理来自服务器的响应。当收到响应时,调用处理程序,ioservice停止,原始阻塞API调用将从服务器释放回客户端。这适用于请求 - 响应类型命令。总结:

  • API阻止调用
  • ioservice重置并启动
  • tcp包发送到服务器
  • 服务器响应
  • 处理程序已调用
  • ioservice停止了
  • 发布API调用并将数据传递给用户

另一个命令是请求响应,它从服务器启动广播,更新客户端的内部缓存。我们的想法是,在初始尝试使用类似于上面的ioservice启动 - 停止过程刷新它之后,用户使用另一个API函数访问此缓存。但是,在此尝试之前,代码使用以下选项之一检查套接字上是否有可用的数据:

  bool is_data_available() {
    //boost::asio::socket_base::bytes_readable command(true);
    //socket_->io_control(command);
    //return command.get() > 0;
      return socket_->available() > 0;
  }

即使服务器已记录已发送数据,也从未有任何数据。

广播摘要:

  • 成功执行上一个项目符号点列表以开始广播
  • 观察服务器已发送数据
  • 调用上面的代码块以查看套接字中是否有任何数据(请注意此时服务尚未启动)
  • 从未有任何数据

0 个答案:

没有答案