試着瞭解boost asio庫,我實現了一個異步回顯服務器。我要求tcp::socket
爲少量數據做一個async_read_some
,即9個字節(選擇測試爲一個小數字),即socket_.async_read_some(boost::asio::buffer(buf, 9), callback)
。然後,我將少量數據提供給服務器,並且讀取命令只有在完整的9個字節才能讀取時回調,而不是在寫入後立即寫入,例如4個字節,正如我所料。什麼決定了什麼時候回調發生,以及爲什麼一旦有一些數據在套接字上可用就不會發生?什麼時候升壓asio調用async_read_some回調?
2
A
回答
2
socket.async_read_some()
操作具有與其同步對應操作socket.read_some()
相同的完成條件。
- 一個或多個數據字節已被成功接收
- 時發生的錯誤,將防止從正在接收
一旦操作完成(成功數據:當任一操作被認爲是完整的或失敗),則ReadHandler將被髮布到io_service
中用於延期調用。此時,ReadHandler可以由服務於io_service
的任何線程調用。
當數據的少量正被寫入的插座,如在問題描述,一個典型地觀察到沒有被髮送,直到隨後的數據被寫入到由於Nagle's algorithm插座數據的行爲。簡而言之,許多系統將嘗試通過將小出站消息連接成單個消息來緩解IP/TCP擁塞,然後發送該消息。爲了顯式地禁用上的每個套接字這個問題,設置boost::asio::ip::tcp::no_delay
選項:
boost::asio::ip::tcp::socket socket(io_service);
// ...
boost::asio::ip::tcp::no_delay option(true);
socket.set_option(option);
有疑問時,監測電線流量與分組分析器,如Wireshark的或tcpdump的,在發送器和接收器兩者。通常可以使用這些工具快速確定問題是發送方還是接收方。在識別違規端時,通常需要深入到內核,驅動程序或硬件文檔中,以確定可能成爲問題根源的配置。
相關問題
- 1. 升壓ASIO async_read_some超時
- 2. 升壓ASIO超時
- 3. 回調傳遞給boost :: asio :: async_read_some在boost :: asio :: read_some返回數據時從未調用
- 4. 什麼時候調用setDataTimeout?
- 5. 什麼時候調用webview.clearData
- 6. 什麼時候調用robot.cleanUp()
- 7. 什麼時候調用onSizeChanged()?
- 8. 什麼時候Cocoa回調給定controll?
- 9. 什麼時候在rails中調用after_touch回調
- 10. 什麼時候使用hash()調用__eq__?
- 11. 什麼時候應該調用SharedPreferencesBackupHelper()/ BackupAgent?
- 12. 什麼時候應該調用setContentAspectRatio?
- 13. 什麼時候可以調用BarcodeScanner.GetDefaultAsync()?
- 14. 什麼時候TGraphicControl.Paint被調用?
- 15. 什麼時候在Linq中調用OnValidate?
- 16. 什麼時候應該調用Transaction.delistResource()?
- 17. 什麼時候initWithCoder被調用?
- 18. BackgroundTransferService - TransferProgressChanged什麼時候被調用?
- 19. 什麼時候ExecutionContext#reportFailure(Throwable)被調用?
- 20. 什麼時候ConvertBack方法被調用?
- 21. 什麼時候在winforms中調用LayoutEngine?
- 22. 什麼時候執行performSelectorOnMainThread調用?
- 23. 什麼時候調用SQLiteOpenHelper方法?
- 24. 什麼時候調用layoutSubviews方法?
- 25. 什麼時候應該調用javax.jdo.Query.close(Object)?
- 26. 什麼時候InitializeCulture被調用
- 27. 什麼時候應該調用Naming.unbind()?
- 28. 什麼時候會調用ctor?
- 29. 什麼時候onNewPicture()被調用?
- 30. 什麼時候應該調用MessageQueue.EndReceive()?
當操作系統發出數據可用時,確實會發生這種情況。這很大程度上取決於硬件緩衝區,IRQ級別等。它基本上是實現定義的。 – sehe
@sehe因此,如果我使用'asyn_read_some',那麼對於boost調用我就沒有什麼不同了?即當套接字打開並且有數據要被讀取時,我可能永遠不會被回調? –
您可以調整sysctls和驅動程序參數。也許你可以使用特定的硬件。您可以在發送端禁用[Nagle算法](https://en.wikipedia.org/wiki/Nagle's_algorithm)。您可以確保沒有路由設備重新排列數據包等。 – sehe