2017-04-19 94 views
2

我已經使用boost :: asio套接字庫已有很多年了。但是,我遇到了一個奇怪的問題。我有一個班級不斷髮送數據到另一個進程。它從隊列中讀取數據,並將其發送,直到隊列變空。我已經從下面的例子中刪除了所有這些細節,以保持簡單。函數socket_write調用asio :: async_write,它在完成時調用writeHandler。我再次從處理程序調用socket_write函數。這在低音量下完美無缺。asio :: async_write處理程序在3秒後被調用

但是,在高容量情況下,事情變得很奇怪。首先,程序設法每秒執行100次socket_write操作。一分鐘左右後,writeHandler不會返回3秒。一旦它回來,另一個100週期在一秒鐘內通過。然後再次writeHandler不會返回3秒。一旦回來,另外100個週期拉回。

我是flummoxed!什麼能使writeHandler每秒返回100次,然後是3秒的延遲,並且每秒回到100次,然後是3秒的延遲?一旦開始,這是一個一致的模式。數據量不是太高,每寫操作不會發送超過幾百個字節。我也對接收服務器上的讀取操作進行了定時,讀取時間不會超過幾個毫秒。延遲僅在寫操作中。

class myclass 
{ 
public: 
    // other stuff 
    void socket_write() 
    { 
     boost::asio::async_write(_socket,boost::asio::buffer(_writeVector), 
      boost::bind(&this_type::writeHandler, shared_from_this(), 
      pSession,boost::asio::placeholders::bytes_transferred, 
      boost::asio::placeholders::error)); 
    } 
    void writeHandler(boost::shared_ptr<MessageSession> pSession, size_t bytesWritten, const boost::system::error_code& ec) 
    { 
      // stuff 
     socket_write(); // Call the socket_write function again. 
    } 
}; 
+0

這很奇怪,你可以用調試器檢查哪一行在'writeHandler'內部消耗了3秒鐘?它正在寫入哪個協議?如果它是一個流,它可能是緩衝區可能會變滿,但這是異步... –

+0

不在寫處理程序。 writeHandler在我執行async_write()函數後3秒鐘被調用。它通常會在幾毫秒內回來。 – Sharath

+0

嘗試一個調試器,直到有人遇到boost asio出現,3秒很多,所以調試器應該告訴你他們要去哪裏。 –

回答

1

想了一會兒,我決定看看是否是緩衝區限制問題。所以我查了一下發送緩衝區大小,它是在64K。所以我將它改爲1MB。

boost::asio::socket_base::send_buffer_size option(1048576); 
    _socket.set_option(option); 

解決了!沒有更多的延遲。

相關問題