Boost Asio要點概述(三)

2021-08-30 08:48:35 字數 4134 閱讀 8608

許多io對資料的操作是按流式來進行的,為此asio提供了流式操作,如上面的streambuf。對最典型的是tcp流,提供了ip::tcp::iostream。下例是乙個簡單的示例。

void iostreamclient(int argc , char* argv)

{ boost::asio::ip::tcp::iostream stream;

stream.expires_after(std::chrono::seconds(20));

try{ stream.connect(argv[1], argv[2]);

std::cout<<"connected"<>buf;

stream <>buf;

std::cout<<"recv:"《這個示例中,一次性傳送給伺服器端內容,並從伺服器端接收應答內容,風格完全是流式資料輸入輸出的樣式。由於iostream中採用了streambuf,其記憶體分配是一次性固定的,所以並不適合多次使用。

總的說,iostream雖然使用起來比較方便,但「控制力」太弱,比較適合做一些測試工具等要求不高的場合。

tcp, udp ,icmp是tcp/ip族中用來通訊的三個協議,asio分別提供了ip::tcp::socket, ip::udp::socket,ip::icmp::socket對它們直接進行了支援,當然還有些輔助類,例如address,endpoint和resolver類,常用的就這麼些。但實際上,asio為了更好的兼任性以及擴充套件方便,抽象出好多基類,它們一般情況下並不直接使用,而是對庫開發者有效。

關於如何用boost.asio來實現socket通訊的文章很多了,不再贅敘。

對外部埠的操作離不開延時,boost.asio中提供了計時器的支援,不過計時器本身的邏輯比較簡單,就是「睡眠一會」再「醒來」。

boost.asio提供了四種計時器:

typedef basic_waitable_timer< chrono::high_resolution_clock > high_resolution_timer;

typedef basic_waitable_timer< chrono::system_clock > system_timer;

typedef basic_waitable_timer< chrono::steady_clock > steady_timer;

typedef basic_deadline_timer< boost::posix_time::ptime > deadline_timer;

deadline_timer基於boost.date_time,是asio中比較「老」的計時器,c++11標準庫chrono出現之後,於是aiso新增了基於std::chrono中的system_clock,steady_clock,high_resolution_clock三種時鐘的計時器,就是前三種,一般情況下,我們應該應用這三種。system_clock與steady_clock的區別可從計算機如何計時來理解:計算機中有乙個晶振,其頻率是精確且不能更改的,計算機上的時間實際上是通過對晶振」tick」的計數來完成的,即時間是某一基準時刻加上tick數*週期,system_clock即基於上面的計算機時間,而steady_clock基於tick數,由於基準時刻可以任意設定,而tick數只能增大,因此system_clock不是「steady」的,而steady_clock是」steady」的,steady_clock一般只用於對時間段(duration)的操作。high_resolution_clock的實現依賴於具體的編譯系統,可以是system_clock或steady_clock。

三種計時器的用法基本是一致的,需要注意的是如果需要多次「定時」,需要多次呼叫expires_after()和wait()或anyc_wait()。

對串列埠的操作可總結如下:

上面的操作步驟與網口的tcp client很一致,尤其是讀寫的方式,這大概也是boost.asio的優點之一。

對domain sockets的支援

boost.asio對domain sockets的支援有兩種方式,一種是對等兩點之間通訊,如下:

local::stream_protocol::socket socket1(my_io_context);

local::stream_protocol::socket socket2(my_io_context);

local::connect_pair(socket1, socket2);

這種可用於程序內,不過用處不大,另一種用於程序間,server-client形式:如下:

伺服器端

::unlink("/tmp/foobar"); // remove previous binding.

local::stream_protocol::endpoint ep("/tmp/foobar");

local::stream_protocol::acceptor acceptor(my_io_context, ep);

local::stream_protocol::socket socket(my_io_context);

acceptor.accept(socket);

客戶端local::stream_protocol::endpoint ep("/tmp/foobar");

local::stream_protocol::socket socket(my_io_context);

socket.connect(ep);

對signal的支援

boost.asio對signal也提供了支援,signal是系統給應用的訊號,表明某件事的發生,可用於跨程序通訊。signal_set是asio對signal的支援類,操作流程如下:

需要注意的是:

windows下有乙個專門的資料結構handle,windows中很多操作都帶有handle,即將操作施加到handle標識的事物上。asio::windows命名空間下也提供了幾個類,對以handle為標識的操作進行了封裝:

windows::random_access_handle

windows::stream_handle

windows::object_handle

對命名pipeline(流式i/o)的操作

windows函式建立   handle handle = ::createfile(...);

asio包裝  windows::stream_handle pipe(io_context, handle);

讀寫   read(), async_read(), write(), async_write()

關閉    close()

對檔案(隨機讀取i/o)的操作

windows函式建立   handle handle = ::createfile(...);

asio包裝 windows::random_access_handle file(io_context, handle);

讀寫   read_some_at(), async_read_some_at(), write_some_at() ,async_write_some_at()

關閉    close()

對事件的操作

windows函式建立   handle handle = ::createevent(...);

asio包裝 windows::object_handle event(io_context, handle);

等待發生  wait(),async_wait()

關閉    close()

可以看出,它們的「套路」都是一樣的。

為保證通訊安全,計算機之間的通訊需要加密進行,為此,boost.asio引入了openssl,並增加一些類和模板來完成此功能。

boost.asio對openssl的封裝應該說比較「淺」,從名字上就能對應出openssl中所指的東西,從封裝的類中,能得到原始的openssl中的控制代碼,進而也可以直接呼叫openssl的函式進行操作。大致的程式設計流程如下:

初始化ssl::context

通過ssl::context設定安全引數,包括證書和驗證,基本與單純用openssl實現的步驟一致

用ssl::stream進行通訊,包括握手。這部分與單純用openssl實現不同,引入的是asio的風格,因而是asio對openssl封裝最大的地方。

軟體測試背景目的要點概述

質量管理領域權威人物j.m.juran將質量定義為 決定產品效能 和 滿意程度 的特徵 而測試注重於產品的滿意度。測試應針對這樣一種情況 軟體產品在一些特定的範圍內不能滿足客戶的合理要求。通過測試過程可以評定質量風險 可能的錯誤 了解被測試系統中存在的錯誤模式 觀察到的錯誤症狀 基於不同的立場,存在...

HTTP學習要點(三)

閘道器可以作為某種翻譯器使用,它抽象出了一種能夠達到資源的方法,是資源和應用程式之間的粘合劑,有些閘道器會自動將http流量轉換為其他協議 協議閘道器應用於不同協議流量之間的轉化 資源閘道器接受網路請求並將其傳送給執行在伺服器上的應用程式 第乙個流行的應用程式閘道器api就是cgi,它是乙個標準介面...

HTTP要點概述 一,TCP IP協議族

一,協議 ios的小夥伴有木有沸騰?此協議非oc中的protocol,但是作用是相似的,都是一種行為規範 二,tcp ip協議 tcp ip協議是網際網路相關的各種協議族的總稱。協議中存在各式各樣的內容。從電纜的規格到 ip 位址的選定方法 尋找異地使用者的方法 雙方建立通訊的順序,以及 web 頁...