2014-02-28 23 views
1

我正在處理客戶端服務器體系結構。我將大約8000000字節的數據從客戶端發送到服務器。我有點驚訝地發現,我的客戶端可以在704毫秒內發送數據,但是服務器需要3922毫秒才能接收這些數據。服務器比使用TCP的客戶端需要更多的時間

雖然我沒有對服務器端的數據做任何操作,只是簡單地接收它。客戶端和服務器硬件架構也一樣。我檢查了使用WIRESHARK的數據流,但在那裏它似乎是~6 times客戶端和服務器時間之間的區別?

  • 什麼是關於爲什麼服務器總是比客戶端需要更多時間的一般假設?
  • 開銷(TCP,UDP,以太網報頭)如何影響通信。

注意:我使用std::Clock()來測量我的客戶端和服務器的執行時間,使用以太網連接將數據傳輸到服務器。

統計:

  • 8000000字節(client704毫秒,服務器3922ms)
  • 8000個字節(client7175毫秒,服務器13188ms)
  • 8億個字節(client72797毫秒,服務器77719ms)
  • 80億字節(client72797 ms,server 77719ms)

//客戶端代碼

std::clock_t c_start = std::clock(); 
    for(int i = 0; i <100000; i++)// writing data to buffer 
    {  
     m_vector.push_back(i); 
    } 
    uint32_t siz = (m_vector.size())*sizeof(double); 
    int total_bytes = 0; 
    int count=0; 
    for(int j=0; j<1000; j++) 
    { 
     bytesSent = send(ConnectSocket,(char*)&siz, 4, 0); 
     assert (bytesSent == sizeof (uint32_t)); 
     std::cout<<"length information is in:"<<bytesSent<<"bytes"<<std::endl; 
     bytesSent = send(ConnectSocket,(char*)m_vector.data(), siz, 0); 
     total_bytes = total_bytes+bytesSent; 
    } 
     closesocket (ConnectSocket); 
    std::clock_t c_end = std::clock(); 
    std::cout << "CPU time used: "<< 1000.0 * (c_end-c_start)/CLOCKS_PER_SEC<< " ms\n"; 
    WSACleanup(); 
    system("pause"); 
    return 0; 
} 

//服務器代碼

while(1) 
    { 
     //code to received data length from the client 
     int length_received = recv(m_socket,(char*)&nlength, 4, 0); 
     m_vector.resize(nlength/sizeof(double)); 

     //code to received data length from the client 
     bytesRecv = recv(m_socket,(char*)m_vector.data(), nlength, 0); 
     count++; 
      if((count==1)) 
      { 
      std::clock_t c_start = std::clock(); 
      } 

     //1st time data 
     if((bytesRecv > 0)) 
     { 
      total_br = total_br + bytesRecv; 
      v1=m_vector; 
      cout<<"Server: Received bytes are"<<total_br<<std::endl; 
     }else {break;} 

     } 
       closesocket (m_socket); 
     std::clock_t c_end = std::clock(); 
     std::cout << "CPU time used: "<< 1000.0 * (c_end-c_start)/CLOCKS_PER_SEC<< " ms\n"; 
     WSACleanup(); 
     system("pause"); 
     return 0; 
    } 
+1

你可能在測量錯誤的東西。告訴我們你的代碼。 – SLaks

+0

尤其是,您可能正在測量寫入緩衝區所需的時間。 – SLaks

+0

@SLaks我想代碼可能不是必需的,你可以看看我剛剛添加的統計信息。對不起,以前的版本我糾正了一些事實。爲什麼我看到這樣的差異,即數據量增長時的時間差較小? – User

回答

0
  1. 在TCP發送僅僅意味着將數據寫入到本地套接字發送緩衝區。 TCP段在網絡上的實際放置是異步的。這意味着,即使在關閉套接字之後,並不是所有的數據都已經被傳輸。因此,發送端時間測量基本上沒有意義。

  2. 沒有什麼值得注意的是,以3922ms接收這種尺寸的轉移。