HP-Socket 是一套通用的高性能 Windows Socket 組件包,包含服務端組件(IOCP 模型)和客戶端組件(Event Select 模型),普遍適用於 Windows 平臺的 TCP/UDP 通訊系統。HP-Socket 對通訊層實現徹底封裝,上層應用沒必要關注通訊層的任何細節;HP-Socket 提供基於事件通知模型的 API 接口,能很是簡單高效地整合到各種應用程序中;另外,爲了讓你們能更方便的學習 HP-Socket,特此精心製做了功能測試示例(Test Echo)、性能測試示例(Test Echo-PFM)、PULL 模型測試示例(Test Echo-Pull) 和 UDP 測試示例(Test Echo-UDP),用戶能夠經過這幾個測試示例入手,迅速掌握組件的設計思想和使用方法。緩存
----------------------------------------------------------------安全
通用性app
- 通訊組件的惟一職責就是接受和發送字節流,絕對不能參與上層協議解析等工做;
- 與上層使用者解耦、互不依賴,組件與使用者經過操做接口和監聽器接口進行交互,組件實現操做接口爲上層提供操做方法;使用者實現監聽器接口把本身註冊爲組件的 Listener,接收組件通知。所以,任何使用者只要實現了監聽器接口均可以使用組件;另外一方面,甚至能夠本身從新寫一個實現方式徹底不一樣的組件實現給使用者調用,只要該組件聽從組件的操做接口,這也是 DIP 設計原則的體現。
可用性socket
可用性對全部通用組件都是相當重要的,若是太難用還不如本身重頭寫一個來得方便。所以,組件的操做接口和監聽器接口設計得儘可能簡單易用(通俗來講就是「傻瓜化」),這兩個接口的主要方法均不超過 5 個。另外,組件徹底封裝了全部的底層 Socket 通訊,上層應用看不到任何通訊細節,沒必要也不能干預任何通訊操做,Socket 鏈接被抽象爲 Connection ID,該參數做爲鏈接標識提供給上層應用識別不一樣的鏈接。函數
高性能性能
做爲底層的通用組件,性能問題是必須考慮的,絕對不能成爲系統的瓶頸。而另外一方面,從實際出發,根據客戶端組件與服務端組件的性能要求採用不一樣的 Socket 模型。組件在設計上充分考慮了性能、現實使用情景、可用性和實現複雜性等因素,確保知足性能要求的同時又不會寫得太複雜。作出如下兩點設計決策:學習
- 客戶端:在單獨線程中實現 Socket 通訊交互。這樣能夠避免與主線程或其餘線程相互干擾;I/O 模型選擇 Event Select 通訊模型。
- 服務端:採用 Windows 平臺效率最高的 IOCP 通訊模型;利用緩存池技術,在通訊的過程當中,一般須要頻繁的申請和釋放內存緩衝區,創建了動態緩存池, 只有當緩存池中沒有可用對象時才建立新對象,而當緩存對象過多時則會壓縮緩存池;另外,組件的動態內存經過私有堆(Private Heap)機制分配,避免與 new / malloc 競爭同時又減小內存空洞。
伸縮性測試
能夠根據實際的使用環境要求設置組件的各項性能參數(如:工做線程的數量、各類緩存池的大小、收發緩衝區的大小、Socket 監聽隊列的大小、Accep 派發的數目以及心跳檢查的間隔等)。優化
*** v3.0.2 更新 ***
> 把 HP-Socket 編譯爲動態連接庫:
-----------------
- 應用程序能夠經過導入源代碼或動態連接庫方式使用 HP-Socket
- 動態連接庫使用方法
方法一: ----------------------------------------------------------------------- (0) 應用程序包含 SocketInterface.h 和 HPSocket.h 頭文件 (1) 調用 HP_Create_Xxx() 函數建立 HPSocket 對象 (2) 使用完畢後調用 HP_Destroy_Xxx() 函數銷燬 HPSocket 對象 方法二: ----------------------------------------------------------------------- (0) 應用程序包含 SocketInterface.h 和 HPSocket.h 頭文件 (1) 建立 CXxxWrapper 包裝器,經過包裝器智能指針使用 HPSocket 對象
- 動態連接庫發行版本
(1) Bin/x86/HPSocket.dll - (32位/MBCS/Release) (2) Bin/x86/HPSocket_D.dll - (32位/MBCS/DeBug) (3) Bin/x86/HPSocket_U.dll - (32位/UNICODE/Release) (4) Bin/x86/HPSocket_UD.dll - (32位/UNICODE/DeBug) (5) Bin/x64/HPSocket.dll - (64位/MBCS/Release) (6) Bin/x64/HPSocket_D.dll - (64位/MBCS/DeBug) (7) Bin/x64/HPSocket_U.dll - (64位/UNICODE/Release) (8) Bin/x64/HPSocket_UD.dll - (64位/UNICODE/DeBug)
> 其它更新:
-----------------
- 把組件接口以及監聽器接口的聲明移到 SocketInterface.h
- IServer 增長接口方法 GetConnectionCount()/GetConnectPeriod() 分別獲取當前鏈接數和某個鏈接的時長
- IServer 接口方法 GetListenAddress()/GetClientAddress() 的 CString& 參數改成 LPTSTR
- IClient 接口方法 GetLocalAddress() 的 CString& 參數改成 LPTSTR
- IClient 接口方法 GetLocalAddress() 的 CString& 參數改成 LPTSTRSocketHelper.h 中全部全局函數的 CString& 參數均改成 LPTSTR
- 示例工程 TestEcho-Pull 和 TestEcho-PFM 改成用動態連接庫方式使用 HP-Socket
> 升級說明:
-----------------
- 使用 HP-Socket v3.0.1 的應用程序能夠安全升級到 HP-Socket v3.0.2
- 因爲某些接口方法的參數做了調整,所以請參考測試工程做相應修改
- 若是工程想經過動態連接庫方式使用 HP-Socket,請參考 TestEcho-Pull 或 TestEcho-PFM 示例工程
*** v3.0.1 更新 ***
> 新增 UDP 通訊組件:
-----------------
- 新增兩個 UDP 通訊組件:CUdpServer 爲服務端組件,CUdpClient 爲客戶端組件
- 服務端組件 CUdpServer 採用 IOCP 通訊模型
- 客戶端組件 CUdpClient 採用 Event Select 通訊模型
- UDP 通訊組件的接口與原 TCP 通訊組件一致,簡單實用
- UDP 通訊組件內置通訊線路自動監測機制
- 新增 UDP 通訊組件示例工程 TestEcho-UDP
> 代碼重構與優化:
-----------------
- 規範全部接口、類以及代碼文件的命名
- 重構和優化了大量組件代碼
- 服務端組件加入讀寫鎖機制,有效平衡處理性能與安全性
- 服務端組件的 Socket 對象緩存列表設置了鎖定時間,提升訪問的安全性
*** v2.2.3 更新 ***
> 鏈接 ID 的數據類型改成 ‘CONNID’:
-----------------
- 在SocketHelper.h 中定義 CONNID 數據類型(默認:typedef ULONG_PTR CONNID)
- 應用程序能夠把 CONNID 定義爲其但願的類型(如:ULONG / ULONGLONG 等)
- 爲了便於移植與維護,應用程序的任何地方都應該用‘CONNID’類型引用鏈接 ID
> 服務端 Socket 組件支持爲每一個鏈接綁定附加數據:
-----------------
- IServerSocket 和 CIocpServer 增長方法 Get/SetConnectionExtra()
- 經過上述兩個方法,應用程序能夠爲每一個鏈接綁定任意附加數據並把數據獲取出來
*** v2.2.2 更新 ***
> 優化心跳檢測相關功能:
-----------------
- IServerSocket 和 IClientSocket 的 Get/SetKeepAliveTimes() 方法改成 Get/SetKeepAliveTime()
- CIocpServer 和 CClientSocket 的默認 KeepAliveTime 屬性改成 5000
- CIocpServer 和 CClientSocket 的默認 KeepAliveInterval 屬性改成 3000
*** v2.2.1 更新 ***
> PULL 模型支持:
-----------------
- ISocketListener 增長 PULL 模型數據接收通知方法 OnReceive(dwConnID, int)
- 增長 PULL Socket 接口 IPullSocket,該接口的 Fetch(dwConnID, pBuffer, iLength) 方法用於抓取通訊數據
> Server:
-----------------
- 服務端 Socket 接口 ISocketServer 更名爲 IServerSocket
- 增長 PULL Server Socket 監聽器抽象類 CPullServerSocketListener
- 增長 PULL Server Socket 接口 IPullServerSocket
- 增長 PULL Server Socket 實現類 CIocpPullServer
> Client:
-----------------
- 客戶端 Socket 接口 ISocketClient 更名爲 IClientSocket
- 客戶端 Socket 實現類 CSocketClient 更名爲 CClientSocket
- 增長 PULL Client Socket 監聽器抽象類 CPullClientSocketListener
- 增長 PULL Client Socket 接口 IPullClientSocket
- 增長 PULL Client Socket 實現類 CPullClientSocket