2017-03-28 43 views
0

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

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()); 
     } 

回答

0

不,我不这么认为。我认为它会测量将数据存入OS的网络堆栈中的缓冲区所需的时间,但不是数据传输到另一端的程序所读取的时间。要做到这一点,唯一的方法是在两端都有精确的时钟,并将发送时间作为消息的一部分发送给接收方,以便它可以执行经过的时间计算。

0

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

不。它测量将数据传输到套接字发送缓冲区的时间。如果套接字发送缓冲区足够大,以至于不是立即将所有数据装入它,它还会测量足够的时间来排空套接字发送缓冲区以适应所有新数据。它不会测量以任何方式将所有这个数据发送到服务器的时间。

假设回叫方法调用对数据到目的地插座的成功写入完成(TCP-ACK接收的)

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

0

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

这里是在本页面升压文件 boost examples

搜索 “ICMP” 的例子