2017-03-28 80 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」 的例子