Boost Asio入門剖析

2022-05-22 09:54:12 字數 1786 閱讀 1310

boost::asio可以在socket等i/o物件上執行同步或非同步操作,使用boost::asio前很有必要了解boost::asio、你的程式以及它們互動的過程。

作為乙個引導的例子,我們思考乙個當乙個socket執行連線操作時發生了什麼,我們首先開始乙個同步的例子

你的程式需要乙個io_service物件,io_service把你的程式和作業系統i/o裝置鏈結起來。

boost::asio::io_service io_service;

你的程式需要乙個i/o物件來執行i/o操作,比如tcp socket

boost::asio::ip::tcp::socket socket(io_service);

執行乙個同步的連線操作時,會順序發生下列事件

1.你的程式通過呼叫i/o物件來啟動連線操作

socket.connect(server_endpoint);

2.i/o物件**請求給io_service

3.io_service通知作業系統執行連線操作

4.作業系統把連線操作的結果返回給io_service

5.io_service把操作的錯誤轉化成boost::system::error_code,乙個error_code可能同特定的值進行比較,或者作為乙個boolen(false結果意味著沒有錯誤發生),結果被傳送會i/o物件。

6.如果操作失敗i/o物件丟擲乙個異常boost::system::error_code,如果啟動操作被替換成下面的寫法

boost::system::error_code ec;

socket.connect(server_endpoint, ec);

那麼操作結果被寫入error_code型別變數ec,而沒有任何異常返回

當乙個非同步操作被執行,另一種不同的事件序列

1.你的程式通過呼叫i/o物件來啟動連線操作

socket.async_connect(server_endpoint, your_completion_handler);

your_completion_handler是乙個函式或者具名的函式物件

void your_completion_handler(const boost::system::error_code& ec);

這個函式物件依賴於正在執行的非同步操作,每個操作按照適當的方式啟動

2.i/o物件把請求傳遞給io_service

3.io_service發訊號通知作業系統啟動乙個非同步連線

時間流逝(同步操作這裡將一直等待)

4.作業系統把操作結果放在乙個佇列中來指示連線啟動完成,供io_service提取結果

5.你的程式通過呼叫io_service::run()(獲取另外一些類似的io_service成員函式)來獲取操作結果,如果有未完成的非同步操作io_service::run()將阻塞,你必須在啟動你的非同步操作後週期性的呼叫它。

6.在io_service::run()內部,io_service把操作結果出列,並傳送給your_completion_handler

這就是boost::asio工作的簡要流程,如果你想要了解高階功能,比如把boost::asio擴充套件到其他型別的非同步操作,你需要更深入的去理解。

Boost asio 學習筆記

boost asio 是個一由c 編寫的 跨平台的 使用現代化c 方法的 提供了統一的非同步模型的網路和底層i o 開發庫。個人理解 io service 就是boost asio 基於os的i o引擎,其他的功能是建立在它之上的 io service 擁有所有非同步i o物件 socket dea...

boost asio,執行緒池

網上大部分人都講boost.asio用完成埠實現,並且實現了執行緒池,所以效率非常的高。我在應用asio的時候發現完成埠是有,但是執行緒池確並不存在,而且在現有的架構下,要想用執行緒池來實現對資料的處理,可能寫出來不是很好看。asio通過開啟執行緒呼叫io service run再呼叫win ioc...

Boost asio 心得筆記

boost asio中有兩點用的不爽 1.asio中的所有物件都引用io service 2.async write還要自己保證內存在completed之前有效 有空要把這兩點搞的更傻瓜一點,實際上在全非同步模式下net io分配兩個執行緒足矣,async搞乙個佇列,completed時候刪掉,還可...