1. 程式人生 > >Boost Asio庫的學習與探究(一)

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時會遇到巨大的挑戰與困難,主要問題如下: 沒