boost用asio設計TCP伺服器的關鍵技術

2021-08-01 12:53:17 字數 1910 閱讀 2788

boost的asio可以設計tcp伺服器,作為通用的伺服器設計,測試客戶端不限於boost寫的client,用多個telnet可以完成併發的測試。

關鍵技術:

(1)管理多連線的類的設計;

(2)單連線的send和recv的處理;

(3)單連線的心跳保鏈的處理;

(4)io_service的併發執行緒的設計;

(5)針對多併發,序列化處理的strand類的使用。

針對(1)的類的設計,其設計的生命週期與伺服器的生命週期一致,負責處理連線的建立,管理和銷毀,取名為channel,每個tcp的連線,我取名叫session,channel類結構如下:

#pragma once  

#include "session.h"

//#include "card.h"

//#define  card_num 8

//typedef boost::shared_ptrchannel_ptr;

class channel

;

boost::asio::ip::tcp::acceptor與handle_accept,負責接受tcp連線,handle_accept中建立連線的類session,

void channel::handle_accept(session_ptr new_session, const boost::system::error_code& error)   

new_session->start();

sessions[new_session->getsessionid()] =new_session;

new_session->start_send("welcome to me!");

last_session =new_session;

session_ptr next_session(new session(io_service_,*this));

acceptor_.async_accept(next_session->socket(),

strand_.wrap(boost::bind(&channel::handle_accept,

this,

next_session,

boost::asio::placeholders::error)));

}

每乙個new_session呼叫start的方法後,acceptor_都會繼續的非同步等待新的連線,async_accept。

sessions是管理各個session的map,stl的map對於key-value的查詢還是比較給力。

run的方法是channel的啟動的主方法,核心部分就是啟動io_service

void channel::run() {

//boost::thread t(boost::bind(&boost::asio::io_service::run,boost::ref(io_service_)));

int thread_count=(std::max)(static_cast(boost::thread::hardware_concurrency()),1);

boost::thread_group tg;

for (int i=0;i除錯的時候,可以單執行緒啟動,發布的時候,可以根據硬體裝置進行多執行緒啟動。這裡執行緒的多少與併發數的多少沒有直接關係。

(4)中提到的io_service的併發執行緒的設計的方法,在這裡也已解決。io_service是根據可用的cpu來確定執行緒的數量,而不是根據實際的工作來分配執行緒,這樣能更充分的使用cpu資源,更加有效。

有了acceptor,map和run的方法,就能構成連線管理類的核心部分,當然其他的**的功能是資料傳送,map的管理,防拷貝等,也一樣有用。

(2)以後的部分,我一會兒再寫。

boost的網路庫asio

boost在1.35版本之後終於加入了網路庫asio。春節期間終於得閒能夠一窺究竟,同時將boost.asio和知名的ace框架做一下比較。asio的名字突出了非同步i o的能力,從asio的文件中看到它使用了和ace proactor框架中相似的proactor模式。csdn上也有很多也寫了很多關...

TCP網路設計

基於tcp 伺服器 建立乙個socket,用函式socket 繫結ip位址 埠等資訊到socket上,用函式bind 設定允許的最大連線數,用函式listen 等待來自客戶端的連線請求,用函式accept 收發資料,用函式send 和recv 或者read 和write 關閉網路連線 include...

asio學習2 TCP伺服器端 對準時間 解析

include ctime include iostream include string include boost asio.hpp using boost asio ip tcp std string make daytime string int tmain intargc,tchar ar...