=================================版權聲明=================================
版權聲明:原創文章 謝絕轉載 啥說的,鄙視那些無視版權隨意抓取博文的爬蟲小網站,祝你們早升極樂。
請通過右側公告中的“聯系郵箱([email protected])”聯系我
勿用於學術性引用。
勿用於商業出版、商業印刷、商業引用以及其他商業用途。
本文不定期修正完善。
本文鏈接:http://www.cnblogs.com/wlsandwho/p/5050318.html
恥辱牆:http://www.cnblogs.com/wlsandwho/p/4206472.html
=======================================================================
沒啥說的,鄙視那些無視版權隨意抓取博文的爬蟲小網站,祝你們早升極樂。
=======================================================================
BOOST幾乎是奇技淫巧的堆砌,來自大神的深深惡意。沒啥說的,鄙視那些無視版權隨意抓取博文的爬蟲小網站,祝你們早升極樂。
這個庫確實不是給初學者像使用C++標准庫那樣用的。沒啥說的,鄙視那些無視版權隨意抓取博文的爬蟲小網站,祝你們早升極樂。
我覺得在使用前,最好了解下四人幫的那個設計模式。沒啥說的,鄙視那些無視版權隨意抓取博文的爬蟲小網站,祝你們早升極樂。
=======================================================================
本文為Boost.Asio下Overview中的內容。
=======================================================================
官方文檔概述中給的模型,以套接字為例,概要的講了同步模型和異步模型都做了什麼事情,我略作修改。沒啥說的,鄙視那些無視版權隨意抓取博文的爬蟲小網站,祝你們早升極樂。
=======================================================================
知識儲備:Proactor和Reactor沒啥說的,鄙視那些無視版權隨意抓取博文的爬蟲小網站,祝你們早升極樂。
兩種高性能I/O設計模式(Reactor/Proactor)的比較
Reactor模式,或者叫反應器模式
=======================================================================
Boost.Asio支持異步操作(通過Proactor模式)和同步操作。沒啥說的,鄙視那些無視版權隨意抓取博文的爬蟲小網站,祝你們早升極樂。
Proactor模式可以不使用多線程來實現並發。
=======================================================================
Boost.Asio和多線程的那些事兒
我覺得,這裡用“線程可重入”來表示更好一點。
簡單的說,用io_service::run()來執行完成例程,用io_service::post()來向線程池投遞任務。
我並不想在Linux和Windows之外的平台上用Boost,事實上我只打算在Windows上寫代碼。忽略這塊應該沒問題。
=======================================================================
當一個名詞不知道怎麼翻譯時,那就不要翻譯。
=======================================================================
Strands
1 只在一個線程裡調用io_service::run(),這是隱式的。
2 像HTTP那種在一個連接裡只有一個異步操作鏈的情況,這是隱式的。
3 明確調用io_service::strand的是顯示的。
(這都說的些什麼啊,不懂。感覺Strands像是把要並行執行的東西放在一個受到訪問鎖保護的queue裡。就像麻繩一樣,好多股擰成了一根。)
=======================================================================
Buffers
boost::asio::basic_streambuf
使用data()來獲得輸入順序。(這樣在循環裡就能獲得輸入數據。)
使用prepare()來獲得輸出順序。(這樣在循環裡就能獲得輸出數據。)
使用commit()來把輸出數據附加到輸入數據的尾部。(從這篇文檔不能看出有毛用,但看起來是復制緩存的。)
使用consume()來移除輸入數據的開始部分。(看起來可以強制認定某塊數據為髒數據,然後丟棄掉。)
按字節復制緩沖
1 boost::asio::streambuf sb; 2 3 std::size_t n = boost::asio::read_until(sock, sb, '\n');//從Socket中獲得數據 4 5 boost::asio::streambuf::const_buffers_type bufs = sb.data();//復制到常量緩沖中 6 7 std::string line(boost::asio::buffers_begin(bufs),boost::asio::buffers_begin(bufs) + n);//復制到string中
=======================================================================
Streams,Short Reads and Short Writes
基於流式的I/O模型
1 使用SyncReadStream的read_some()來實現同步讀。
3 使用SyncWriteStream的write_some()來實現同步寫。
2 使用AsyncReadStream的async_read_some()來實現異步讀。
4 使用AsyncWriteStream的async_write_some()來實現異步寫。
傳輸精確的字節:
read()
async_read()
write()
async_write()
=======================================================================
Reactor-Style Operations
看起來像是說,對於那些自己實現了通信功能的第三方組件想要集成到使用Asio庫中時,Asio庫提供了null_buffer類型用於讀寫操作。
在I/O對象就緒前,nullbuffer操作不會返回。
看例子中是read_handler處理程序完成操作後,async_read_some函數才會返回。
=======================================================================
Line-Based Operations
按行讀取 "\r\n"
read_until
async_read_until
讀取數據直到遇到空格
typedef boost::asio::buffers_iterator<boost::asio::streambuf::const_buffers_type> iterator; std::pair<iterator, bool> match_whitespace(iterator begin, iterator end) { iterator i = begin; while (i != end) if (std::isspace(*i++)) return std::make_pair(i, true); return std::make_pair(i, false); } boost::asio::streambuf b; boost::asio::read_until(s, b, match_whitespace);
讀取數據直到遇到指定字符
class match_char { public: explicit match_char(char c) : c_(c) {} template <typename Iterator> std::pair<Iterator, bool> operator()(Iterator begin, Iterator end) const { Iterator i = begin; while (i != end) if (c_ == *i++) return std::make_pair(i, true); return std::make_pair(i, false); } private: char c_; }; namespace boost { namespace asio { template <> struct is_match_condition<match_char> : public boost::true_type {}; } } // namespace boost::asio boost::asio::streambuf b; boost::asio::read_until(s, b, match_char('a'));
(沒看懂is_match_condition是想干什麼。看起來是向命名空間裡添加了擴展。沒具體例子沒看出有什麼用。)