2010-09-07 96 views
0

我已經使用Boost Asio創建了客戶端 - 服務器體系結構。提升Asio問題,服務器端客戶端,在真實網絡上緩慢?

整個工作,我可以發送和接收消息等,所以沒有關於正確性的問題。然而,當我在一個真實的網絡中實現它時,突然它變得非常緩慢。當我在同一臺計算機上運行服務器和客戶端時,速度非常快,但是當我在兩臺不同的計算機上運行它時,它變得非常慢,我必須等待每條消息一秒鐘。這些信息很少可能是50個,最多60個字符。他們雖然正確地發送。

的代碼:

stream = new tcp::iostream(serverIp, portNum); // Clientside 

用於發送和接收使用:

(*stream) << data << delimiter; 
std::getline(*stream, response, '#'); 

服務器使用相同的發送和接收,並用於建立連接的一些設置代碼:

boost::asio::io_service io_service; 

tcp::endpoint endpoint(tcp::v4(), portNum); 
tcp::acceptor acceptor(io_service, endpoint); 

for (;;) 
{ 
    tcp::iostream *stream = new tcp::iostream(); 
    acceptor.accept(*(stream->rdbuf())); 

    // Do stuff with the stream 
} 

它再次起作用,在真正的網絡上突然變得非常緩慢。有什麼我做錯了嗎?我試圖改變portNum,沒有工作。還有什麼我可以做的?

回答

2

如果這是您的發送/接收代碼的總和,那麼似乎等待發送者和接收者在< <和getline調用完成之前同步的時間會很多。在引入真正的網絡連接時,這種影響會大大增加。它在本地看起來很快,但在假設之前本地測量字節吞吐量。通常情況下,你不會像這樣緊密地耦合發送和接收處理 - 你基本上正在使用一個異步I/O庫並強制它同步。嘗試重新工作以實際使用異步I/O,並將發送和接收處理彼此分離(或者至少不要使用同步的更高級別的I/O調用訪問套接字來將它們序列化),並且網絡性能應該會提高。

+0

你會如何建議這樣做呢?我應該從哪裏開始,這很難做到嗎? – kiri 2010-09-07 12:27:58

+0

使用async_read和async_write – 2010-09-07 12:32:27

+0

是的,這很難做到,但是你會很高興你學會了如何做到這一點。使用Google追蹤一些示例代碼,理解它(最好通過在調試器中運行它),然後相應地重新設計您的設計。 – 2010-09-07 12:38:25

0

準備要離線發送的數據,然後使用async_write寫入數據。用async_read從socked讀取數據。這些是非阻塞操作,所以它可能會對服務器端產生重大影響。

0

也許不是修復它,但值得一try--更改客戶端刷新消息發送後的數據流:

(*stream) << data << delimiter << std::flush;