2 {
3 // 轉(zhuǎn)換消息
4 NetMessageCaptureRecievedMsg(NetMessagemsg); // 在交給處理器之前
5 NetMessageCaptureBeforeSendMsg(NetMessagemsg); // 在發(fā)送出去之前
6
7 bool Enabled{ get ; set ;} // 是否啟用本Hook
8 }
通過(guò) INetMessageHook 接口可以看到,當(dāng)消息進(jìn)入系統(tǒng)時(shí)回被 CaptureRecievedMsg 方法截獲(比如,進(jìn)行解密處理),當(dāng)把消息發(fā)送到網(wǎng)絡(luò)之前,將被 CaptureBeforeSendMsg 方法截獲(比如,進(jìn)行加密處理)。
如果有多個(gè)
INetMessageHook
,則可以形成一個(gè)
HookList
,消息經(jīng)過(guò)
HookList
時(shí),分別按順序被每個(gè)
INetMessageHook
處理,
ESFramework
中的
HookList
的參考實(shí)現(xiàn)是
EsbNetMessageHook
,并且它也實(shí)現(xiàn)了
INetMessageHook
接口,這樣就可以把一個(gè)
Hook
鏈當(dāng)作一個(gè)
Hook
了。
其源碼如下:

需要特別注意的是, HookList 的實(shí)現(xiàn)中,逐個(gè)調(diào)用 Hook 的 CaptureRecievedMsg 方法的順序必須與逐個(gè)調(diào)用 CaptureBeforeSendMsg 方法的順序相反,這就是為什么 EsbNetMessageHook 實(shí)現(xiàn) CaptureBeforeSendMsg 方法時(shí),出現(xiàn)下列代碼的原因:
為了說(shuō)明為什么需要顛倒
Hook
鏈的情況,可以舉個(gè)例子,假設(shè)有一個(gè)“原始消息”從系統(tǒng)
1
發(fā)送到系統(tǒng)
2
,其間經(jīng)過(guò)了兩個(gè)
Hook
,一個(gè)加密
Hook
,一個(gè)是壓縮
Hook
,則可表示如下:
系統(tǒng)
1
=》原始消息=》加密=》壓縮=》發(fā)送
系統(tǒng)
2
=》接收消息=》解壓縮=》解密=》原始消息
還要提醒的是,在具體的
Hook
實(shí)現(xiàn)中,截獲處理經(jīng)常改變
Body
的大小,如果
Body
的大小真的發(fā)生了變化,一定要更新消息頭(
IMessageHeader
)中的
MessageBodyLength
字段。
通常,采用Hook時(shí),服務(wù)端與客戶端是對(duì)稱的,所以你可以把所有的Hook實(shí)現(xiàn)放在一個(gè)Dll中,這樣服務(wù)端和客戶端可以共同使用這個(gè)Hook Dll了。
由于對(duì)網(wǎng)絡(luò)消息進(jìn)行壓縮是常見(jiàn)的需求,所以我把
BaseZipHook
納入到了
ESFramework
中,并且,這也是
IMessageHeader
存在
ZipMe
屬性的原因。
ZipMe
屬性用于通知
BaseZipHook
是否對(duì)接收到的本條消息進(jìn)行解壓縮,是否在發(fā)送本消息之前進(jìn)行壓縮。
BaseZipHook
實(shí)現(xiàn)如下:

BaseZipHook 是一個(gè)抽象類,具體實(shí)現(xiàn)的壓縮算法由派生類通過(guò)覆寫 Zip 和 Unzip 方法提供。如果要實(shí)現(xiàn)一個(gè)具體的 ZipHook ,你可以從 BaseZipHook 繼承,并采用 ZipHelper 提供的壓縮 / 解壓縮功能。
到現(xiàn)在為止,我們已經(jīng)討論了關(guān)于消息的比較多的內(nèi)容了,但還有一個(gè)非常重要的組件沒(méi)有講到,那就是消息分派器
ITcpStreamDispatcher
,消息分派器直接與
Tcp
組件或
Udp
組件聯(lián)系,并且所有消息的進(jìn)出都要經(jīng)過(guò)
ITcpStreamDispatcher
,所以分派器是一個(gè)對(duì)消息進(jìn)行
Hook
的理想位置,并且消息分派器會(huì)把具體的消息分派到對(duì)應(yīng)的消息處理器上。欲知道
ITcpStreamDispatcher
的原理與實(shí)現(xiàn),請(qǐng)繼續(xù)關(guān)注下文:
ESFramework
介紹之(
5
)
――
消息分派器
ITcpStreamDispatcher
上一篇:
ESFramework介紹之(3)――消息處理器和處理器工廠
轉(zhuǎn)到:
ESFramework 可復(fù)用的通信框架(序)
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
