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

时间:2017-03-28 22:07:44

标签: c++ sockets boost boost-asio

我有以下代码来衡量从客户端到服务器的套接字写入所花费的总时间。 (假设回调方法调用是在成功将数据写入目标套接字(收到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());
        }

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

  

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

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

  

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

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

答案 2 :(得分:0)

它测量将数据放入网络堆栈中的发送缓冲区的时间。 如果你想计算&#34;网络时间&#34;,请使用icmp :: socket,就像&#34; ping&#34;命令呢。

这是boost文档中的示例 boost examples

搜索&#34; ICMP&#34;在这个页面