C++實現網路伺服器命令模式(設計及模板實現)

來源:互聯網
上載者:User

Client->request Server->response模式的網路伺服器中,對應答的處理一般是採用switch模式。

此方法比較難於維護,且缺少錯誤偵測。

本文採用C++模板實現一套較為通用的伺服器命令處理模型。

閱讀本文你應該對C++模板較為熟悉。

ok,進入正題。

假定客戶命令包頭為。

struct MsgHead{

DWORD type;

};

定義用戶端命令模板類。

template<DWORD reqCode>

class RequestT:protected MsgHead{

STATIC_CHECK(0,REQUEST_NOT_DEFINED);

};

定義宏對具體命令做偏特化。

#define DECL_REQUEST(reqCode)/

template<>/

class RequestT<reqCode>:public MsgHead{/

friend class RequestHandlerT<reqCode>;/   //處理函數

RequestT<reqCode>(){}

#define END_DECL(code)/

};

定義回應類

template<DWORD resCode,DWORD reqCode>

class ResponseT:protected MsgHead{

STATIC_CHECK(0,REQUEST_NOT_DEFINED);

};

偏特化

#define DECL_RESPONSE(reqCode,resCode)/

template<>/

class ResponseT<resCode>:public MsgHead{/

friend class RequestHandlerT<reqCode>;/   //處理函數

ResponseT<resCode>(){type=resCode;}

定義處理函數.

typedef  int CommandHandler(MsgHead* in,MsgHead* out);

處理函數模板

template <DWORD code>

class HandlerT{

static int Handle(MsgHead*in,MsgHead* out);

};

定義命令映射表格

struct cmd_set{

DWORD dwRequest;

CommandHandler* pHandler;

};

定義命令映射宏

#define MAP_CMD(code)/

{code, HandlerT<code>::Handle},

ok,整個架構以基本搭建好了。

現在來寫一個簡單的命令處理試試。

//用戶端請求

enum{

CR_CONNECT,

};

//伺服器回應

enum{

SR_OK,

SR_DENY

};

//請求包格式

DECL_REQUEST(CR_CONNECT)

WORD wReason;

DWORD dwVerify;

END_DECL(CR_CONNECT)

//成功回應格式

DECL_RESPONSE(CR_CONNECT,SR_OK)

DWORD dwConnectionID

END_DECL(CR_CONNECT)

//拒絕包回應格式

DECL_RESPONSE(CR_CONNECT,SR_DENY)

DWORD    dwError;

END_DECL(CR_CONNECT)

//處理函數

template<>

class HandlerT<CR_CONNECT>{

static int Handle(MsgHead*in,MsgHead*out){

MsgRequestT<CR_CONNECT>* pIn=static_cast<MsgRequest<CR_CONNECT>*>(in);

switch(pIn.wReason){

......

}

.....

return out包長度

}

}

建立映射表

cmd_set Cmd_MAP[]={

MAP_CMD(CR_CONNECT)

..................

};

主函數中通過wType尋找Cmd_MAP找到處理函數後調用函數處理包。

//==============================================================================

上面的模型可以用宏進一步減少工作量。(如HandlerT<>等)

另外MsgHead及其衍生類別(各種request/response)都不應該允許被執行個體化,否則處理函數可能出錯(處理函數並不知道實際可寫包長)。

可以將MsgHead建構函式聲明為protected的。只將可以被執行個體化的實際子類聲明為public.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.