您的位置:首頁 > 教程 > C語言教程 > boost.asio框架系列之buffer函數

boost.asio框架系列之buffer函數

2022-06-18 17:49:37 來源:易采站長站 作者:

boost.asio框架系列之buffer函數

創建buffer

在io操作中,對數據的讀寫大都是在一個緩沖區上進行的,在asio框架中,可以通過asio::buffer函數創建一個緩沖區來提供數據的讀寫。buffer函數本身并不申請內存,只是提供了一個對現有內存的封裝。LaV站長之家-易采站長站-Easck.Com

char?d1[128];
size_t?bytes_transferred = sock.receive(asio::buffer(d1));

直接用字符串做buffer也是常見的形式:LaV站長之家-易采站長站-Easck.Com

string?str =?" hello world "?;
size_t?bytes_transferred = sock.send(asio::buffer(str));

除了這些基礎類型外,也可以使用stl中的容器,非常方便。LaV站長之家-易采站長站-Easck.Com

asio::buffer(std::vector<char>(128));
asio::buffer(std::array<char,128>());

將buffer還原為數據對象

前面的操作是通過把數據對象封裝成buffer,在使用過程中往往也需要把buffer還原為數據對象。LaV站長之家-易采站長站-Easck.Com

char* p1 = asio::buffer_cast<char*>(buffer);

獲取buffer大小

可以通過buffer_size函數獲取buffer大小。LaV站長之家-易采站長站-Easck.Com

size_t?s1 = asio::buffer_size(buf);

讀寫buffer

讀寫buffer一般都是和io對象相關聯的,io對象成員函數中就提供了讀寫操作。以tcp::socket對象為例,它提供了read_some和write_some來實現讀寫操作:LaV站長之家-易采站長站-Easck.Com

std::array<char, 128> buf;
sock.read_some(asio::buffer(buf));

另外,asio名字空間下也提供了通用的read、write函數,通過它們可以實現更加高級的讀寫功能LaV站長之家-易采站長站-Easck.Com

size_t?bytes_transfered = asio::read(sock, asio::buffer(buf),?asio::transfer_all(), err);

這里我就使用了transfer_all標記強制讀滿buffer才返回,另外還有兩個比較常用的標記transfer_at_least()和transfer_exactly(),非常方便。LaV站長之家-易采站長站-Easck.Com

streambuf

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

    //通過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函數,可以實現讀到滿足指定條件的字符串為止,對于解析協議來說非常有用。LaV站長之家-易采站長站-Easck.Com

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庫了)LaV站長之家-易采站長站-Easck.Com

自定義內存分配

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

到此這篇關于boost.asio框架系列之buffer函數的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持易采站長站。LaV站長之家-易采站長站-Easck.Com

如有侵權,請聯系QQ:279390809 電話:15144810328

相關文章

  • VS2019項目打包生成.exe文件與Setup的步驟實現

    VS2019項目打包生成.exe文件與Setup的步驟實現

    對于Visual Studio Installer ,我們通常稱為:setup項目,是一個用于自定義安裝部署的項目方案。但是在VS2019中不見了,微軟是有意廢除安裝項目的,合作了一個第三方的安裝項目單獨使用。
    2020-03-13
  • 基于c++ ege圖形庫實現五子棋游戲

    基于c++ ege圖形庫實現五子棋游戲

    本文分享的五子棋實例,制作基于ege圖像庫, 首先需要安裝配置ege環境 就可以編寫小游戲了. 用到的ege庫函數不多 , 主要是基于c++的. 先看界面效果: 輸入界面:(就是控制臺) 游戲勝利界面
    2020-01-06
  • C++基于easyx圖形庫實現推箱子游戲

    C++基于easyx圖形庫實現推箱子游戲

    本文實例為大家分享了C++實現推箱子游戲的具體代碼,供大家參考,具體內容如下 頭文件: #includestdio.h#includestdlib.h//#includeWindows.h#includeconio.h#includegraphics.h#includestdbool.h //播放音樂需要
    2020-06-30
  • VS2019 Nuget找不到包的問題處理

    VS2019 Nuget找不到包的問題處理

    VS不記得改了什么設置之后,發現找不到EF 解決辦法 1、點擊右側的設置按鈕 2、彈出窗中左側樹形結構選擇“程序包源”,再點擊右上方的添加按鈕 輸入一下信息:https://www.nuget.org/a
    2020-03-27
  • visual studio2019的安裝以及使用圖文步驟詳解

    visual studio2019的安裝以及使用圖文步驟詳解

    一、下載安裝包 下載地址 選擇visual studio 2019的community版本 二、下載好后運行 三、組件的選擇 如果是用來學CC++的話,選擇以下兩個就夠了 之后如果還需要其他一些功能的話,可以后
    2020-03-08
  • VScode編譯C++ 頭文件顯示not found的問題

    VScode編譯C++ 頭文件顯示not found的問題

    一直用codeblocks,想試試vscode,結果這個問題給我弄懵逼了。一開始以為是iostream這個頭文件not found,后來發現第一個頭文件都會這樣顯示,放到后面就不會了,然而,光這一個顯示not
    2020-03-20
  • C++多線程獲取返回值方法詳解

    C++多線程獲取返回值方法詳解

    在許多時候,我們會有這樣的需求——即我們想要得到線程返回的值。但是在C++11 多線程中我們注意到,std::thread對象會忽略頂層函數的返回值。 那問題來了,我們要怎么獲得線程的返
    2020-06-25
  • JVM系列之String.intern的性能解析

    JVM系列之String.intern的性能解析

    String對象有個特殊的StringTable字符串常量池,為了減少Heap中生成的字符串的數量,推薦盡量直接使用String Table中的字符串常量池中的元素。 那么String.intern的性能怎么樣呢?我們一起來
    2020-06-23
色七七影院_香港三级台湾三级在线播放_男人放进女人阳道猛进猛出