程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> BOOST.Asio,boost

BOOST.Asio,boost

編輯:C++入門知識

BOOST.Asio,boost


=================================版權聲明=================================

版權聲明:原創文章 謝絕轉載  啥說的,鄙視那些無視版權隨意抓取博文的爬蟲小網站,祝你們早升極樂。

請通過右側公告中的“聯系郵箱([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是想干什麼。看起來是向命名空間裡添加了擴展。沒具體例子沒看出有什麼用。)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved