boost庫在工作(32)網路服務端之二

2021-06-16 16:43:38 字數 1726 閱讀 2486

下面來仔細地看連線處理的**,如下:

//封裝乙個服務端類來處理網路。

class cconnect :

public boost::enable_shared_from_this< cconnect >

boost::asio::ip::tcp::socket& getsocket(void)

void start(void)

void handleread(const boost::system::error_code& error,

size_t bytes_transferred) }

void handlewrite(const boost::system::error_code& error) }

private:

// boost::asio::ip::tcp::socket m_socket;

// boost::arraym_chbuffer;

std::string m_strhit;

};

在這個例子裡,表示伺服器與乙個客戶端的溝通渠道,就是乙個連線,封裝為類cconnect。它是當伺服器接收到乙個客戶端連線請求之後建立的,主要用來就是管理這個連線的生命週期,以及資料的接收和傳送。從生命週期上來說,當乙個連線建立時就旦生了,那什麼時候死亡呢?在這個類的設計上是非常優秀,非常巧妙的,因為它不會為多生存一點時間而存在,也不會提前死掉而導致非法的記憶體訪問。有這樣的特性,主要是得益於它繼承類enable_shared_from_this< cconnect >,這個類enable_shared_from_this的魔力,就是為了在類內部函式使用shared_ptr,可以維護類的例項不至於失去控制,導致提前死亡。也許你會說,在類裡內部直接使用shared_ptr< cconnect >(this)進行強制轉換,不就是乙個智慧型指標了嗎?可是在shared_ptr這樣的智慧型指標是不能進行強制轉換,因為強制轉換並不能增加類物件的生命長度。也許你會說,還有別的方法,在類裡增加乙個shared_ptr< cconnect >成員變數,這樣可以儲存起來了,就達到生命週期的延長了。但這個方案雖然可以物件生命週期變長了,但也導致物件永遠刪除不了,這時,你也應想起前面學習過的shared_ptr智慧型指標時的一大缺陷,就是不能迴圈地引用。因此,需要使用weak_ptr智慧型指標做為成員變數,這樣就沒有這個問題了,這就是enable_shared_from_this所實現的方案,這就是為什麼要繼承enable_shared_from_this的原因。這樣就可以解決智慧型指標在類內部引用的情況,但也有乙個限制的,就是不能在這個類的建構函式裡使用shared_from_this(),因為在建構函式裡還沒有真正建立shared_ptr,這時就去使用,顯然是過早了。

有了這個魔法類之後,就可讓物件的生命週期從乙個區域性作用域裡轉換到另外乙個地方,比如在伺服器接收到連線時呼叫handleaccept函式,緊跟著呼叫cconnect的start函式,在這個函式就呼叫了shared_from_this()函式,這樣就讓cconnect物件在區域性作用域快要結束之時,再給它增加了生命,因此cconnect物件就可以在每次收到資料或傳送資料時,都可以決定是否還要繼續生存下去,都是通過呼叫shared_from_this()函式來實現的。這樣當連線出錯時,不再去呼叫shared_from_this()函式,導致這個物件生存期到了,就自動刪除,達到釋放資原的目標。

從這個例子裡,不但學習到網路伺服器怎麼樣接收客戶端的連線,也學習到在類成員函式裡維持乙個共享智慧型指標的生存下去的方法,這樣不僅讓管理記憶體更簡單,並且讓資源的利用率達到極點,完全是按需分配,不早也不遲,何樂而不為。

boost庫在工作(32)網路服務端之二

在這個例子裡,伺服器物件主要使用boost asio io service物件,這個物件主要用來構造非同步接收資料使用,接著定義boost asio ip tcp acceptor物件,這個物件主要用來接收所有連線進來到伺服器的連線,也就是起到監聽的作用。在伺服器類的建構函式裡主要呼叫接受物件的as...

boost庫在工作(31)網路服務端之一

先來看看例子的第一部份,接收連線伺服器部份,如下 伺服器,主要接收新連線,並啟動新連線接收資料。class cserver 收到客戶端連線進來事件響應。void handleaccept boost shared ptr cconnect pnewconnect,const boost system...

boost庫在工作(36)網路服務端之六

在上面介紹了管理所有連線的類,這個類主要就是新增新的連線,或者刪除不需要的連線。但是管理的類callconnect是沒有辦法知道什麼時候新增,什麼時候刪除的,它需要從接收到連線類裡獲取得到新的連線,從連線類裡獲得刪除的事件。如下面的 封裝乙個服務端類來處理網路。軟體開發人員 蔡軍生 2013 07 ...