日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【Boost】boost库asio详解7——boost::asio::buffer用法

發布時間:2024/4/11 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Boost】boost库asio详解7——boost::asio::buffer用法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. asio::buffer常用的構造方法

asio::buffer有多種的構造方法,而且buffer大小是自動管理的

1.1 字符數組

[cpp]?view plain?copy ?print?
  • char?d1[128];??
  • size_t?bytes_transferred?=?socket.receive(boost::asio::buffer(d1));??
  • 1.2 字符向量

    [cpp]?view plain?copy ?print?
  • std::vector<char>?d2(128);??
  • size_t?bytes_transferred?=?socket.receive(boost::asio::buffer(d2));??
  • 1.3 boost的數組

    [cpp]?view plain?copy ?print?
  • boost::array<char,?128>?d3;??
  • size_t?bytes_transferred?=?sock.receive(boost::asio::buffer(d3));???
  • 1.4 字符串

    [cpp]?view plain?copy ?print?
  • string?str?=?"hello?world";??
  • bytes_transferred?=?socket.send(boost::asio::buffer(str));???
  • 2. asio::buffer的常用方法

    2.1 轉換方法

    [cpp]?view plain?copy ?print?
  • boost::asio::mutable_buffer?b1?=boost::asio::buffer(str);??
  • unsigned?char*?p1?=?boost::asio::buffer_cast<unsigned?char*>(b1);??
  • 2.2 獲取大小

    [cpp]?view plain?copy ?print?
  • std::size_t?s1?=?boost::asio::buffer_size(b1);??
  • 3. asio::buffer的讀寫問題

    注意 的是boost::asio::const_buffer是只讀的buffer, 而boost::asio::mutable_buffer則可寫。
    讀寫buffer也是有講究的?

    3.1 與transfer_all()結合

    [cpp]?view plain?copy ?print?
  • boost::array<char,?128>?buf;??
  • boost::system::error_code?ec;??
  • std::size_t?n?=?boost::asio::read(??
  • ????socket,??
  • ????boost::asio::buffer(buf),??
  • ????boost::asio::transfer_all(),??
  • ????ec);??
  • if?(ec)??
  • {??
  • ??//?An?error?occurred.??
  • }??
  • else??
  • {??
  • ??//?n?==?128??
  • }??
  • boost::asio::transfer_all()能夠使buffer中的所有數據都傳送完畢。即讀滿buffer為止。

    3.2 與transfer_at_least()結合

    [cpp]?view plain?copy ?print?
  • std::size_t?n?=?boost::asio::read(??
  • ????socket,??
  • ????boost::asio::buffer(buf),??
  • ????boost::asio::transfer_at_least(64),??
  • ????ec);??
  • 意義即讀滿64字節為止。返回。

    當然還有最常用的bytes_transferred,這個例子就很多了。?


    streambuf

    asio::streambuf則是提供了一個流類型的buffer,它自身是能申請內存的。它的好處是可以通過stl的stream相關函數實現緩沖區操作,處理起來更加方便。

    ????//通過streambuf發送數據
    ????asio::streambuf?b;
    ????std::ostream?os(&b);
    ????os <<?"Hello, World!\n";

    ????size_t?n = sock.send(b.data());????// try sending some data in input sequence
    ????b.consume(n);?// sent data is removed from input sequence

    ?

    ????//通過streambuf讀數據
    ????asio::streambuf?b;
    ????asio::streambuf::mutable_buffers_type?bufs = b.prepare(512);????// reserve 512 bytes in output sequence
    ????size_t?n = sock.receive(bufs);
    ????b.commit(n);????// received data is "committed" from output sequence to input sequence

    ????std::istream?is(&b);
    ????std::string?s;
    ????is >> s;

    另外,asio名字空間下還提供了一個的read_until函數,可以實現讀到滿足指定條件的字符串為止,對于解析協議來說非常有用。

    ????size_t?n = asio::read_until(sock, stream,?'\n');
    ????asio::streambuf::const_buffers_type?bufs = sb.data();
    ????std::string?line(asio::buffers_begin(bufs), asio::buffers_begin(bufs) + n);

    這個指定條件除了是字符串外,還可以是正則表達式,非常給力。這也是asio庫為什么要依賴于boost.regex的原因。(雖然regex已經標準化了,但仍得使用boost.regex庫。等什么時候asio也標準化后估計就可以直接使用std.regex庫了)

    自定義內存分配

    異步IO操作時往往會申請動態內存,使用完后就釋放掉;在IO密集型的場景中,頻繁的申請釋放內存對性能會有較大影響。為了避免這個問題,asio提供了一個內存池式的模型?asio_handler_allocate?和?asio_handler_deallocate?來復用內存。

    例子我就不寫了,可以參看boost官方文檔示例,或者網上的這篇文章。

    就我個人而言,并不贊成在項目的前期就使用上這個allocator,畢竟這樣帶來了很大的代碼復雜度。而是作為一個性能優化點,在后期性能優化的時候再試試用它有沒有效果。并且內存池的也有很多不同的方案,google的google-perftools也值得一試。


    總結

    以上是生活随笔為你收集整理的【Boost】boost库asio详解7——boost::asio::buffer用法的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。