溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

boost.asio框架系列之buffer函數怎么使用

發布時間:2022-06-20 09:28:18 來源:億速云 閱讀:319 作者:iii 欄目:開發技術

本文小編為大家詳細介紹“boost.asio框架系列之buffer函數怎么使用”,內容詳細,步驟清晰,細節處理妥當,希望這篇“boost.asio框架系列之buffer函數怎么使用”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

創建buffer

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

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

直接用字符串做buffer也是常見的形式:

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

除了這些基礎類型外,也可以使用stl中的容器,非常方便。

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

將buffer還原為數據對象

前面的操作是通過把數據對象封裝成buffer,在使用過程中往往也需要把buffer還原為數據對象。

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

獲取buffer大小

可以通過buffer_size函數獲取buffer大小。

size_t s1 = asio::buffer_size(buf);

讀寫buffer

讀寫buffer一般都是和io對象相關聯的,io對象成員函數中就提供了讀寫操作。以tcp::socket對象為例,它提供了read_some和write_some來實現讀寫操作:

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

另外,asio名字空間下也提供了通用的read、write函數,通過它們可以實現更加高級的讀寫功能

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

這里我就使用了transfer_all標記強制讀滿buffer才返回,另外還有兩個比較常用的標記transfer_at_least()和transfer_exactly(),非常方便。

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.asio框架系列之buffer函數怎么使用”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女