一個用于協議開發的 C++ 框架
前言
歡迎!這里有一個網絡基礎類的抽象封裝,開發者可以構建網絡協議的具體實現。它以C++庫的形式提供了一套類集,任何人都可以使用它構建程序。
這些抽象的主要好處是便于將這些協議實現集成到程序中我們不想浪費時間實現期望的協議或者使用一個第三方實現的地方。
此外,這些抽象便于員工協同工作,復用他們的工作并且提供其它實現的接口。例如,一些開發者可以致力協議的實現,另一些則聚集于協議測試工具。
目標
解決當前所有問題和滿足所有需求的抽象層級是最好的,可以在更改之前保持長時間的有效性。此外,它應該符合人類思維并且足夠精確。這意味著所有的差異都要集中到一個模型中。這些抽象應該在開發者看到他們的時候感到自然順暢,并且能夠在整個實現過程中指導他們如何實現協議。
下面這些目標是要告知協議開發者的。從程度開發的觀點來看,抽象層級應該便于協議實現在應用中集成以便于調用,更重要的是將線路通信協議置于兩個通信進程的首要位置。例如,增加傳輸安全驗證應該通過少量的線路通信協議調用實現。如果應用程序需要傳輸海量數據并且我們發現其中一個通信端使用了壓縮數據協議,它應該在高層協議實現數據的解壓縮。下面的圖表演示了一個例子,當網絡層數據進入傳輸層TLS時,需要將IP數據包解碼成傳輸層的有效負荷Websocket幀,然后再解壓成離散的字節緩沖單元,最后序列化成應用程序可以使用的對象消息結構。當應用程序傳遞消息時,先序列化成字節緩沖單元,然后壓縮并轉換成Websocket幀,編碼并發送給TCP。
實現
在規劃協議的抽象層次之前,需要一個人瀏覽很多協議實現并且推論出公共的要求。從我的經驗來看,我會將了解到的重要要求寫在一張清單上。對于別人贊揚或者批評的評論我都會表示贊賞。
編碼和序列化:協議盡量使數據的表示方式透明。在一個協議棧的層級上,上層協議將會按照字節處理收到的數據。如果不是商用協議就不要將數據序列化成特殊的結構,或者期望使用一種特殊類型來進行序列化。協議將會將字節編碼成另一種字節,也會將字節解碼成另一種字節。我認為任何協議實現都應該超越這個層次,作一些額外的數據填充使得協議實現復用和同一層次協議聚集變得困難等等。
許多協議需要一種通信路徑存儲每一連接數據。編碼和解碼可能依賴于數據的演化。(在協議框架中,這種類稱為 ProtocolContext類)。
當收到數據時,每一個協議層都試圖解碼內容并傳遞到上一層協議中。這個過程會不斷重復直到沒有協議層可以將數據推送到上層時。這也意味著每一層需要數據緩沖區和更多的讀操作。
當收到數據時,它不應該被直接送到緩沖區,一些協議將會對內容進行轉換,所以我們應該在預先讀到的數據中沒有增加新的內容并且尚未提交給上一層時提供轉換操作。
當協議解碼數據時,它可能返回解碼后的數據,也可能將數據交由對等的應用程序處理而不介入數據解碼。這種數據被稱為控制信息,它將會滿足許多協議的需要。最簡單的例子,當一層協議需要送 heart beat信息時其它的協議必須予以回復。
抽象應該提供一種方式便于協議層進入初始化階段,在這期間,上層協議和應用層不應當發送任何數據直到初始化完成。例如,如果在Websocket和 TLS層,當一個連接建立時,我們需要TLS層完成握手操作,然后再給Websocke發送OK信息并開始交換數據。應用程序代碼不能開始任何操作直到Websocke完成握手操作。
用例:
如果你想瀏覽一個完整的框架工作用例,你可以瀏覽CodePlex上的 Push Framework repository 中的Websocket solution。
http://pushframework.codeplex.com/SourceControl/latest(查找 version 3.0,打開WebsocketServer 目錄)。
WebsocketProtocol 是一個使用ProtocolFramework抽象實現Websocket Protocol (RFC 6455) 的庫文件。DemoServer是一個僅打印出它接收到數據的示例服務器。多虧那些在Autobahn Websocket測試站點的不知名的客戶端,它將WebsocketProtocol視為協議而我用它使協議實現變得健壯。
感謝ProtocolFramework,我可以輕易在不同的協議之間轉換,聚集同層協議一起工作,甚至使用多端口監聽不同類型的客戶端并理解特殊的協議棧。
MyServer theServer; WebsocketProtocol webProtocol;//Create a listening port using unsecured port. ListenerOptions lOptions; lOptions.pProtocol = &webProtocol; theServer.createListener(10010, &lOptions);
//Create a second listening port, for secured clients: SSLProtocol sslProtocol; if (!sslProtocol.initializeAsServer("E:\certificates\server.crt", "E:\certificates\server.key", "pass")) { cout << "ssl initialization failed"<< endl; return -1; } WebsocketProtocol webProtocol2; webProtocol2.addLowerProtocolLayer(&sslProtocol); ListenerOptions lOptions2; lOptions2.pProtocol = &webProtocol2; theServer.createListener(10010, &lOptions2); theServer.start(true)</pre>
本文地址:http://www.oschina.net/translate/a-cplusplus-framework-for-protocol-development
原文地址:http://www.codeproject.com/Articles/775740/A-Cplusplus-framework-for-Protocol-development
</div>
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!相關資訊
相關經驗