ACE開發遊戲伺服器

2021-04-26 20:26:36 字數 3412 閱讀 9829

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...