Boost Asio庫的學習與探究(一)
對於boost庫的強大的能力,相信用過boost的人都知道。筆者作用一個小白,今天開始一一探究boost asio庫的一些東西,這裡著重探究和網路有關的內容。由於之前沒有看過asio的原始碼,這裡不免有疏漏和不足,甚至是錯誤之處,這裡歡迎大家一起來探討。
boost/asio.hpp. 這裡的檔案這中好像沒有什麼特別的東西,只包含了一系列的標頭檔案。我們可以在www.boost.org/libs/asio上看到相關的文件資料。其中有這樣一段:
#if defined(_MSC_VER) && (_MSC_VER >= 1200)
# pragma once
#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
估計是有編譯器相關的。
asio.hpp的東西沒什麼可看的,接下來由於我們主要看的是網路相關的東西,那麼一下檔案自然是tcp.hpp.我們一句一句的來解析這些程式碼。
首行,它聲明瞭一個basic_endPoint<tcp>的別名 endpoint.從這個形式我們可以知道basic_endpoint是一個端點類的模板。從名字我作出以下端點的假設,首先,網路之中的通訊都是主機與主機之間的,那麼我們是否可以認為一個主機就是一個端點呢?下面,讓我們來看一下這個模板類(basic_endpoint.hpp).
文件註釋是這樣寫的 The boost::asio::ip::basic_endpoint class template describes an endpoint that may be associated with a particular socket.(boost::asio::ip::basic_endpoint 模板描述了一個可能被一個特別的套接字關聯的端點).既然是模板類,必然需要一個抽像資料型別,我們來看template <typename InternetProtocol>從名字可以看到,basic_endpoint的模板引數是一個網路協議。
接下來,basic_endpoint又聲明瞭兩個別名,一個是typedef InternetProtocol protocol_type;這是它本身的模板引數,我們不用管,下一個typedef boost::asio::detail::socket_addr_type data_type;這是一個網路地址的型別。我們在這裡對於這個網路地址,先不進去,免得遞迴太深而找不到主線。我們在這裡只需要知道這是一個網路地址型別。下面我們來看一下它的資料成員,它的說明說的很明確,它是一個基本的IP端點。boost::asio::ip::detail::endpoint impl_;看來boost::asio::detail這個名稱空間值得我們一看,但同樣的肯定這是這個時候。ok,看到這裡我們下一步需要了解一下basic_endpoint的建構函式。它有一個預設建構函式 :
basic_endpoint():impl_(){
};
一個帶協議和埠號的建構函式 :
basic_endpoint(const InternetProtocol& internet_protocol,
unsigned short port_num)
: impl_(internet_protocol.family(), port_num)
{
}
這裡我簡單的說一下它的用法,例如:boost::asio::ip::tcp::endpoint ep(boost::asio::ip::tcp::v4(),1234);這是一個以IPV4為協議,以1234為埠號的端點。我們只關心從1234這個埠上傳遞過來的連線,所以我們可以不管本身的ip地址,相當於winodws網路程式設計中的INADDR_ANY。
一個帶IP地址,埠號的建構函式:
basic_endpoint(const boost::asio::ip::address& addr, unsigned short port_num)
: impl_(addr, port_num)
{
}
我們可以使用它接收連線或者連線一個端點。
還有一個複製建構函式這裡不列舉。然後過載了一個=。
下面我們看一下成員函式:
1、protocol_type protocol() const
{
if (impl_.is_v4())
return InternetProtocol::v4();
return InternetProtocol::v6();
}
它返回關聯的socket上使用的是ipv4或者ipv6的協議。
2、data_type* data()
{
return impl_.data();
}
我們先暫時跳過這個函式,回頭再看detail裡面具體的東西。
3.std::size_t size() const
{
return impl_.size();
}
同上。
4.void resize(std::size_t new_size)
{
impl_.resize(new_size);
}
同上。
5、std::size_t capacity() const
{
return impl_.capacity();
}
同上。
6. unsigned short port() const
{
return impl_.port();
}
返回埠號。
7.void port(unsigned short port_num)
{
impl_.port(port_num);
}
設定埠號。
8.
boost::asio::ip::address address() const
{
return impl_.address();
}
返回ip地址。
9.void address(const boost::asio::ip::address& addr)
{
impl_.address(addr);
}
設定ip地址。
10.11 過載== 和 != 。
12. 13 過載< 和 >.
14.15 過載 <= 和 >=.
看到這裡可能你會有許多的疑問:1.跳過的幾個成員函式裡到底做了哪些操作?2.過載的幾個運算子有什麼用?下一篇文章中將會作進一步的學習與探究。
相關推薦
Boost Asio庫的學習與探究(一)
對於boost庫的強大的能力,相信用過boost的人都知道。筆者作用一個小白,今天開始一一探究boost asio庫的一些東西,這裡著重探究和網路有關的內容。由於之前沒有看過asio的原始碼,這裡不免有疏漏和不足,甚至是錯誤之處,這裡歡迎大家一起來探討。 boost/asi
Boost Asio庫的學習與探究(三)
到這裡已經是第三篇文章了,這一章我會來進一步介紹tcp.hpp.上一章我們談到,tcp必須顯示構造且建構函式私有,那麼怎樣來構建tcp的物件呢,這裡使用的是靜態成員函式。這是對類的進一步封裝。 1、 static tcp v4() { ret
Kotlin學習與實踐 (一)基礎
eat 代碼塊 數據 eas 特性 neu 簡潔 跟著 pla 1、 函數和變量 直奔主題不啰嗦 * a.關鍵字 fun 用來聲明函數。* b.參數的類型寫在參數名字的後面。* c.函數可以定義再文件的最外層,不需要把它放入類中。* d.數組就是類。 和Java不同Kotl
Docker學習與實踐(一)
docker一、docker的安裝 1.依賴包安裝 yum install -y yum-utils device-mapper-persistent-data lvm2 2.添加yum源 yum-config-manager --add-repo https://mirrors.ustc.edu.cn/do
JSP學習與理解(一)
parse runtime this java服務 b站 sps odin 作用域 地址欄 一.JSP的運用 1).WHYJSP是簡Servlet編寫的一種技術,它將Java代碼和HTML語句混合在同一個文件中編寫,只對網頁中的要動態產生的內容采用java代碼來編寫,
MyBatis學習與使用(一)
如果 none con stack 重要 value 順序 package ase 寫在前面—— 用 MyBatis 也做過幾個項目了,但是一直沒有很深入的去理解這個框架,最近決定從頭開始學習和整理MyBatis。 之前開發的項目並不是我先創建的,等我介入的時候發現他們已經
Flask框架的學習與實戰(一):開發環境搭建
進行 read 模型 clas tar pychar html itl .html Flask是一個使用 Python 編寫的輕量級 Web 應用框架。其 WSGI 工具箱采用 Werkzeug ,模板引擎則使用 Jinja2。很多功能的實現都參考了django框架。由於項
記錄摘要筆記:學習習慣:學習與思考(一)
1、做讀書筆記。一是將自己閱讀的時候思考(包括閃念)總結下來,二是將書中的好例子摘抄下來(google note)。 2. 將思考成為習慣還有一個很大的好處——避免焦慮。卡耐基用一整本書講了一個有效的做法來避免焦慮——底線思考。 另一個有效的做法,就是投入地做另一件事情。 3.重要的事情優先(
ArcGIS for Android 100.3的學習與應用(一) 如何繪製點和線?
平時工作中,我們接觸到的地圖類開發平臺有很多,最常用的有高德,百度,騰訊地圖。而且它們都有自己的開發者平臺和文件供我們使用。基本能滿足我們的業務需求。 由於公司裡的專案會涉及一些地圖資料統計和展示方面的需求,同時也會發布一些地圖服務,所以選擇了使用在地圖方面比較牛逼的ArcGIS。 把平時遇
EMV規範學習與研究(一)——背景介紹
EMV標準是由國際三大銀行卡組織--Europay(歐陸卡,已被萬事達收購)、MasterCard(萬事達卡)和Visa(維薩)共同發起制定的銀行卡從磁條卡向智慧IC卡轉移的技術標準,是基於IC卡的金融支付標準,已成為公認的全球統一標準。 1999年2月,當時的國際三大
Android ArcGIS的學習與應用(一) 如何繪製點和線?
平時工作中,我們接觸到的地圖類開發平臺有很多,最常用的有高德,百度,騰訊地圖。而且它們都有自己的開發者平臺和文件供我們使用。基本能滿足我們的業務需求。 由於公司裡的專案會涉及一些地圖資料統計和展示方面的需求,同時也會發布一些地圖服務,所以選擇了使用在地圖方面比較
Netty-Mina深入學習與對比(一)
感謝支付寶同事[易鴻偉]在本站釋出此文。 這博文的系列主要是為了更好的瞭解一個完整的nio框架的程式設計細節以及演進過程,我選了同父(Trustin Lee)的兩個框架netty與mina做對比。版本涉及了netty3.x、netty4.x、mina1.x、mina2.x、mina3.x。這裡
(轉)Libcap庫學習::(一)簡介
Libpcap是Packet Capture library的英文縮寫,即資料包捕獲函式庫,該庫提供的C函式介面用於捕獲經過指定網路介面(通過將網絡卡設定為混雜模式,可以捕獲所有經過該網路介面的資料包)的資料包。 Libpcap面向上層應用,提供了使用者級別的網路資料包捕獲介面,在系統部署時
機器學習之SVM初解與淺析(一):最大距離
機器學習 svm 最大距離 2 / ||w|| 這段時間在看周誌華大佬的《機器學習》,在看書的過程中,有時候會搜搜其他人寫的文章,對比來講,周教授講的內容還是比較深刻的,但是前幾天看到SVM這一章的時候,感覺甚是晦澀啊,第一感覺就是比較抽象,特別是對於像本人這種I
機器學習之SVM初解與淺析(一):
機器學習 svm 最大距離 2 / ||w||sdsshngshan‘gccha 這段時間在看周誌華大佬的《機器學習》,在看書的過程中,有時候會搜搜其他人寫的文章,對比來講,周教授講的內容還是比較深刻的,但是前幾天看到SVM這一章的時候,感覺甚是晦澀啊,第一感覺就
mysql數據庫索引優化與實踐(一)
都是 分鐘 必備 範圍查詢 無法使用 RM strong span 實踐 前言 mysql數據庫是現在應用最廣泛的數據庫系統。與數據庫打交道是每個Java程序員日常工作之一,索引優化是必備的技能之一。 為什麽要了解索引 真實案例 案例一:大學有段時間學習爬蟲,爬取了知乎30
Git的學習與使用(四)——Git 工作區、暫存區和版本庫
基本概念 我們先來理解下Git 工作區、暫存區和版本庫概念 工作區:就是你在電腦裡能看到的目錄。 暫存區:英文叫stage, 或index。一般存放在 ".git目錄下" 下的index檔案(.git/index)中,所以我們把暫存區有時也叫作索引(index)。 版本庫:工作區有一個隱
JavaFX學習筆記——重要理念的建立與辨析(一)
儘量使用css設定樣式 原因: 1.CSS語法簡單,格式統一,簡化了程式碼重用的方法,使得頁面邏輯與頁面樣式的設計相分離,更有利於團隊協作。更改起來也更加方便。 2.在靜態(即只需初始化一次,沒有太多複雜的額外操作)的元件樣式設定或者簡單動態響應(如滑鼠移入時的樣式,只需在類名中加“:h
記錄我的Python學習之旅(一)關於turtle庫的基本用法
關於庫函式的匯入方法:①import <> ②import <> as <> ③ from tutle import <> 1、turtle.setup(width,height,startx,starty) /
Netty學習之路(一)- 同步與非同步IO
本篇部落格主要是講一些基礎,記錄我的學習過程,同時嘗試養成寫部落格的習慣。內容基本來自Netty權威指南加上一丟丟的個人理解。。。。 I/O基礎入門 在jdk1.4以前,java對i/o的支援並不完善,開發人員在開發高效能i/o時會遇到巨大的挑戰與困難,主要問題如下: 沒