Boost:asio 套接字读/写所花费的时间

Posted

技术标签:

【中文标题】Boost:asio 套接字读/写所花费的时间【英文标题】:Boost:asio time taken for socket read/write 【发布时间】:2017-03-28 22:07:43 【问题描述】:

我有以下代码来测量从客户端到服务器的套接字写入所花费的总时间。 (假设回调方法调用是在成功将数据写入目标套接字(收到 TCP-ACK)时完成的)这是否确保 - 这次是数据传输的实际“网络时间”?

  void on_successful_read_from_client(const boost::system::error_code& error,
                              const size_t& bytes_transferred)
  
     if (!error)
     

      m_telnet_server_write_time = posix_time::microsec_clock::universal_time();
      async_write(telnet_server,
              boost::asio::buffer(data_from_device_,bytes_transferred),
              boost::bind(&bridge::on_successful_send_to_server,
                    shared_from_this(),
                    boost::asio::placeholders::error));

     
     else
        close();
  

  void on_successful_send_to_server(const boost::system::error_code& error)
  
     if (!error)
     
        posix_time::ptime now = posix_time::microsec_clock::universal_time();

        if ((now - m_telnet_server_write_time).total_milliseconds() > 0)
        
            std::ostringstream log;
            log << "Time Taken for server write: " << (now - m_telnet_server_write_time).total_milliseconds() << " ms";

            write_log(log.str());
        

【问题讨论】:

【参考方案1】:

不,我认为不会。我认为它测量了将数据放入操作系统网络堆栈中的缓冲区所需的时间,而不是数据传输到连接另一端的程序并由程序读取所需的时间。您可以做到这一点的唯一方法是在两端都有准确的时钟,并将发送时间作为消息的一部分发送给收件人,以便它可以计算经过的时间。

【讨论】:

【参考方案2】:

它测量将数据放入网络堆栈中的发送缓冲区的时间。 如果要计算“网络时间”,请使用 icmp::socket,就像“ping”命令一样。

这是 boost 文档中的示例 boost examples

在此页面中搜索“ICMP”

【讨论】:

【参考方案3】:

这是否确保 - 这个时间是数据传输的实际“网络时间”?

没有。它测量将数据传输到套接字发送缓冲区的时间。如果套接字发送缓冲区足够满以至于不能立即将所有数据装入其中,它还会测量充分耗尽套接字发送缓冲区以容纳所有新数据的时间。它不测量以任何方式将所有数据发送到服务器的时间。

假设回调方法调用是在成功将数据写入目标套接字(收到 TCP-ACK)时完成的

不是。当所有数据都传输到套接字发送缓冲区时调用它。

【讨论】:

以上是关于Boost:asio 套接字读/写所花费的时间的主要内容,如果未能解决你的问题,请参考以下文章

boost::asio 扩展 TCP 套接字

如何在 boost asio 中设置阻塞套接字的超时时间?

我们可以用 boost.asio 创建未命名的套接字来模拟匿名管道吗?

C++ Boost.Asio - tcp 套接字异步写入

使用 boost::asio 获取 UDP 套接字远程地址

如何确定是不是有数据可从 boost::asio 中的套接字读取?