在
win32
平台上最有效率的
io模型,莫過於完成埠了。
csdn
上到處都是關於完成埠的問題。在
ace中對
win32
平台的完成埠有著非常好的封裝。
ace中前攝式框架的
win32
實現就是使用的完成埠。我們先來看看這個框架有哪些組成部分。
ace_proactor
前攝器,真怪異的名字。叫非同步事件分配者多好啊。
ace_service_handler
事件處理器。處理所有非同步操作的結果。
ace_asynch_accept
非同步連線接受器。用來監聽來自客戶的連線請求。
ace_asynch_read_stream
非同步讀取器。發起非同步讀操作的請求。
ace_asynch_write_stream
非同步寫入器。發起非同步寫操作的請求。
嗯!東西差不多齊了。不要看到上面的東西就害怕,其實很簡單,請相信我。
我們先來講一下,執行的流程。
首先,我們會使用
accept
的open
()方法,,監聽乙個埠。
ace_inet_addr
localhost
;localhost
.set
(8888
,「127.0
.0.1
「);acceptor
.open
(localhost
);此時,當有客戶端的連線請求到達時,前攝器會自動的呼叫
acceptor
的make_handle
()方法,來建立乙個事件處事器,處理這個連線的使用者。
//我定義的使用者事件處理器類,繼承於ace_service_handler
ctg_gs_user_handler
*puser_handler
;//使用ace的建立巨集,分配乙個空間。
ace_new_noreturn
(puser_handler
,ctg_gs_user_handler
(this
));if
(puser_handler
==null
)return
puser_handler
;前攝器通過呼叫這個方法後,得到了
puser_handler
的控制代碼,並將
socket
與這個控制代碼定到一起。
隨後,前攝器會緊接著呼叫
ctg_gs_user_handler
的open
方法。方法的原型如下:
void
ace_service_handler
::open
(ace_handle new_handle
,ace_message_block
& message_block )這是
ace_service_handler
的乙個虛方法,需要我們來繼承,以完成我們的事件處理器的一些初始化準備。
上面我們定義的
ctg_gs_user_handler
類,是乙個很重要的組成部分,處理絕大部分的
io事件。他繼承於
ace_service_handler
,實現了以以下的三個方法。
virtual
void
handle_time_out
(const
ace_time_value
& tv
,const
void*p
);定時器**函式
virtual
void
handle_read_stream
(const
ace_asynch_read_stream
::result
& result
);讀操作**函式
virtual
void
handle_write_stream
(const
ace_asynch_write_stream
::result
& result
);寫操作**函式
比如,當我們發起乙個非同步的讀操作時。
//reader_是乙個上面提到的非同步讀取器
reader_
.read
(*mblk_
,sizeof
(ccmdmessagehead
));當讀操作完成,或部分完成時,會**
handle_read_stream
方法。我們要做如下的處理。
void
ctg_gs_user_handler
::handle_read_stream
(const
ace_asynch_read_stream
::result
& result
)elseif(
result
.bytes_transferred
()<
result
.bytes_to_read
())//如果沒有接收完成,繼續接收。
reader_
.read
(*mblk_
,result
.bytes_to_read
()-result
.bytes_transferred
());
elseif(
mblk_
->
length
()==
sizeof
(ccmdmessagehead
))ace_new_noreturn
(mblk_
,ace_message_block
(ace_default_cdr_bufsize
));ace_cdr
::mb_align
(mblk_
);reader_
.read
(*mblk_
,sizeof
(ccmdmessagehead
));}
else
}else
ace_new_noreturn
(mblk_
,ace_message_block
(ace_default_cdr_bufsize
));ace_cdr
::mb_align
(mblk_
);reader_
.read
(*mblk_
,sizeof
(ccmdmessagehead
));}
return;}
這樣,我們就完整地接到了乙個訊息
遊戲伺服器開發 準備篇 初識遊戲伺服器開發
近期轉換了工作方向,從web開發走向了遊戲開發。此前的工作中,主要負責web分布式專案的開發,rest服務開發,幷包含一部分im系統的開發。分布式系統框架,資料庫,nosql接觸的比較多,比較雜。而新工作比較單一,主要負責遊戲伺服器的業務開發。使用的也是前輩封裝好的框架。後來發現,原來全公司都使用了...
遊戲伺服器開發綜述 目錄
這個系列大概每天會更新一章,主要介紹如何構建乙個高效能伺服器 我們可能採用skynet的框架進行分析 之後,會涉及到很多遊戲伺服器開發的知識,可能會開放一些原始碼,也可能只會提供一些.so檔案。另外,需要注意的是,我們的伺服器主要是存放在ubuntu18.04版本中,如果導致在其它的版本出現無法使用...
mysql 做遊戲伺服器配置 遊戲伺服器部署
bin bash 小菜鳥 掛機 版本 1.0 遊戲伺服器部署 基礎環境 mysql資料庫svn客戶端需部署才能執行此指令碼 if uid 0 then echo game server install else exit 1 firead p please create the storage ga...