ESFramework介绍之(30)―― 消息侦察者 INetMessageSpy
生活随笔
收集整理的這篇文章主要介紹了
ESFramework介绍之(30)―― 消息侦察者 INetMessageSpy
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
????(本文適用于ESFramework V0.2+)
??? 現(xiàn)在我們回想一下,當(dāng)網(wǎng)絡(luò)組件(Tcp/Udp組件)接收到一個消息后,這個消息會流經(jīng)哪些組件,然后再通過網(wǎng)絡(luò)組件發(fā)送出去了。如果你研究過ESFramework V0.1,你會發(fā)現(xiàn),消息“行走”的路線模型可以用下圖表示出來:
??? 請求消息(路徑由黑線表示)經(jīng)過網(wǎng)絡(luò)組件后,會被Hook鏈中的各個Hook按照特定的順序處理,然后到達(dá)消息處理器,消息處理器處理請求消息,并給出回復(fù)消息(路徑由紅線表示),回復(fù)消息同樣再經(jīng)過Hook鏈,然后通過網(wǎng)絡(luò)組件發(fā)送出去。
??? 我們知道,Hook的主要目的是對截獲的消息進(jìn)行變形處理(比如,加密/解密,壓縮/解壓等),它會修改消息體的內(nèi)容。假設(shè)我們現(xiàn)在有這樣的需求,我們需要在服務(wù)端監(jiān)控接收到的某一特定類型的所有消息,比如,我們的終端用戶每隔一定時間會把自己的當(dāng)前位置(經(jīng)緯度)通過PositionMessage上報給服務(wù)器,服務(wù)器需要截獲所有這些消息,然后在屏幕的地圖上更新表示每個終端用戶的點的位置。
??? 我們需要截獲所有的PositionMessage,似乎可以使用Hook,但是,我們并不需要修改PositionMessage的內(nèi)容,只是Peek它,所以,這與Hook的語義是不一致的。我們需要一種新的組件來反映這個語義,ESFramework(V0.2+)中的INetMessageSpy正是用于此目的。INetMessageSpy與INetMessageHook的區(qū)別就恰恰在于,INetMessageSpy只是peek消息內(nèi)容,而不修改它;而INetMessageHook會對消息進(jìn)行變形處理。
??? 應(yīng)用通常需要在兩個地方Spy消息,一個是網(wǎng)關(guān)(即網(wǎng)絡(luò)組件)處,一個是消息處理器附近。對應(yīng)這兩個位置,ESFramework提供了相應(yīng)的Spy,分別是IGatewayMessageSpy和IInnerMessageSpy,它們都從INetMessageSpy繼承。這三個接口的定義如下:
對應(yīng)代碼如下:
????public?interface?INetMessageSpy
????{
????????bool?Enabled?{?set;}
????????void?SpyRecievedMsg(NetMessage?msg);?//如請求消息
????????void?SpyToBeSendedMsg(NetMessage?msg);//如回復(fù)消息
????}
???
????public?interface?IGatewayMessageSpy?:?INetMessageSpy
????{
????}
???
????public?interface?IInnerMessageSpy?:?INetMessageSpy
????{
????} ????
??? 下面的圖示將更清楚的展示IGatewayMessageSpy和IInnerMessageSpy位于消息路線圖中的位置:
??? 一目了然!比如上面例子中的監(jiān)控用戶位置的Spy就可以使用IInnerMessageSpy,因為IInnerMessageSpy偵察到的消息都是能夠解析的(通常消息到達(dá)這里,都已經(jīng)經(jīng)過了Hook鏈的解密、解壓縮了)。如果需要監(jiān)視網(wǎng)關(guān)(網(wǎng)絡(luò)組件)的所有進(jìn)出消息,則可以使用IGatewayMessageSpy。
????Spy通常用于服務(wù)端,對應(yīng)于Tcp和Udp,ESFramework分別在TcpStreamDispatcher組件和IEsbUdp組件中增加了對Spy的支持。通過TcpStreamDispatcher.InnerMessageSpy屬性、TcpStreamDispatcher.GatewayMessageSpy屬性、IEsbUdp.InnerMessageSpy屬性、IEsbUdp.GatewayMessageSpy屬性可以注入你需要使用的Spy。
????
??? ok,本文可以結(jié)束了,感謝關(guān)注!
上一篇:ESFramework介紹之(29)―― 插件公共設(shè)施 AddinUtil
轉(zhuǎn)到?? :ESFramework 可復(fù)用的通信框架(序)?
??? 現(xiàn)在我們回想一下,當(dāng)網(wǎng)絡(luò)組件(Tcp/Udp組件)接收到一個消息后,這個消息會流經(jīng)哪些組件,然后再通過網(wǎng)絡(luò)組件發(fā)送出去了。如果你研究過ESFramework V0.1,你會發(fā)現(xiàn),消息“行走”的路線模型可以用下圖表示出來:
??? 請求消息(路徑由黑線表示)經(jīng)過網(wǎng)絡(luò)組件后,會被Hook鏈中的各個Hook按照特定的順序處理,然后到達(dá)消息處理器,消息處理器處理請求消息,并給出回復(fù)消息(路徑由紅線表示),回復(fù)消息同樣再經(jīng)過Hook鏈,然后通過網(wǎng)絡(luò)組件發(fā)送出去。
??? 我們知道,Hook的主要目的是對截獲的消息進(jìn)行變形處理(比如,加密/解密,壓縮/解壓等),它會修改消息體的內(nèi)容。假設(shè)我們現(xiàn)在有這樣的需求,我們需要在服務(wù)端監(jiān)控接收到的某一特定類型的所有消息,比如,我們的終端用戶每隔一定時間會把自己的當(dāng)前位置(經(jīng)緯度)通過PositionMessage上報給服務(wù)器,服務(wù)器需要截獲所有這些消息,然后在屏幕的地圖上更新表示每個終端用戶的點的位置。
??? 我們需要截獲所有的PositionMessage,似乎可以使用Hook,但是,我們并不需要修改PositionMessage的內(nèi)容,只是Peek它,所以,這與Hook的語義是不一致的。我們需要一種新的組件來反映這個語義,ESFramework(V0.2+)中的INetMessageSpy正是用于此目的。INetMessageSpy與INetMessageHook的區(qū)別就恰恰在于,INetMessageSpy只是peek消息內(nèi)容,而不修改它;而INetMessageHook會對消息進(jìn)行變形處理。
??? 應(yīng)用通常需要在兩個地方Spy消息,一個是網(wǎng)關(guān)(即網(wǎng)絡(luò)組件)處,一個是消息處理器附近。對應(yīng)這兩個位置,ESFramework提供了相應(yīng)的Spy,分別是IGatewayMessageSpy和IInnerMessageSpy,它們都從INetMessageSpy繼承。這三個接口的定義如下:
對應(yīng)代碼如下:
????public?interface?INetMessageSpy
????{
????????bool?Enabled?{?set;}
????????void?SpyRecievedMsg(NetMessage?msg);?//如請求消息
????????void?SpyToBeSendedMsg(NetMessage?msg);//如回復(fù)消息
????}
???
????public?interface?IGatewayMessageSpy?:?INetMessageSpy
????{
????}
???
????public?interface?IInnerMessageSpy?:?INetMessageSpy
????{
????} ????
??? 下面的圖示將更清楚的展示IGatewayMessageSpy和IInnerMessageSpy位于消息路線圖中的位置:
??? 一目了然!比如上面例子中的監(jiān)控用戶位置的Spy就可以使用IInnerMessageSpy,因為IInnerMessageSpy偵察到的消息都是能夠解析的(通常消息到達(dá)這里,都已經(jīng)經(jīng)過了Hook鏈的解密、解壓縮了)。如果需要監(jiān)視網(wǎng)關(guān)(網(wǎng)絡(luò)組件)的所有進(jìn)出消息,則可以使用IGatewayMessageSpy。
????Spy通常用于服務(wù)端,對應(yīng)于Tcp和Udp,ESFramework分別在TcpStreamDispatcher組件和IEsbUdp組件中增加了對Spy的支持。通過TcpStreamDispatcher.InnerMessageSpy屬性、TcpStreamDispatcher.GatewayMessageSpy屬性、IEsbUdp.InnerMessageSpy屬性、IEsbUdp.GatewayMessageSpy屬性可以注入你需要使用的Spy。
????
??? ok,本文可以結(jié)束了,感謝關(guān)注!
上一篇:ESFramework介紹之(29)―― 插件公共設(shè)施 AddinUtil
轉(zhuǎn)到?? :ESFramework 可復(fù)用的通信框架(序)?
轉(zhuǎn)載于:https://www.cnblogs.com/zhuweisky/archive/2006/05/17/402746.html
總結(jié)
以上是生活随笔為你收集整理的ESFramework介绍之(30)―― 消息侦察者 INetMessageSpy的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 页面间传输中文的乱码解决方法
- 下一篇: WPF应用程序模型