天天看點

高性能 Socket 元件 HP-Socket v3.2.1-RC2 釋出

  hp-socket 是一套通用的高性能 tcp/udp socket 元件,包含服務端元件、用戶端元件和 agent 元件,廣泛适用于各種不同應用場景的 tcp/udp 通信系統,提供 c/c++、c#、delphi、e、java

等程式設計語言開發接口。hp-socket 對通信層實作完全封裝,上層應用不必關注通信層的任何細節;hp-socket 提供基于事件通知模型的 api 接口,能非常簡單高效地整合到新舊應用程式中。為了讓使用者能友善快速地學習和使用 hp-socket,迅速掌握元件的設計思想和使用方法,特此精心制作了大量 demo 示例,包括 push 模型示例、pull模型示例和性能測試示例等。hp-socket 目前運作在 windows 平台,将來會實作跨平台支援。

----------------------------------------------------------------

通用性

通信元件的唯一職責就是接受和發送位元組流,絕對不能參與上層協定解析等工作;

與上層使用者解耦、互不依賴,元件與使用者通過操作接口和監聽器接口進行互動,元件實作操作接口為上層提供操作方法;使用者實作監聽器接口把自己注冊為元件的 listener,接收元件通知。是以,任何使用者隻要實作了監聽器接口都可以使用元件;另一方面,甚至可以自己重新寫一個實作方式完全不同的元件實作給使用者調用,隻要該元件遵從元件的操作接口,這也是 dip 設計原則的展現。

可用性

  可用性對所有通用元件都是至關重要的,如果太難用還不如自己重頭寫一個來得友善。是以,元件的操作接口和監聽器接口設計得盡量簡單易用(通俗來說就是“傻瓜化”),這兩個接口的主要方法均不超過 5 個。另外,元件完全封裝了所有的底層 socket 通信,上層應用看不到任何通信細節,不必也不能幹預任何通信操作,socket 連接配接被抽象為 connection id,該參數作為連接配接辨別提供給上層應用識别不同的連接配接。

高性能

  作為底層的通用元件,性能問題是必須考慮的,絕對不能成為系統的瓶頸。而另一方面,從實際出發,根據用戶端元件與服務端元件的性能要求采用不同的 socket 模型。元件在設計上充分考慮了性能、現實使用情景、可用性和實作複雜性等因素,確定滿足性能要求的同時又不會寫得太複雜。做出以下兩點設計決策:

用戶端:在單獨線程中實作 socket 通信互動,這樣可以避免與主線程或其他線程互相幹擾;i/o 模型選擇 event select 通信模型。每個元件對象管理一個 socket 連接配接。

服務端:采用高效的 iocp 通信模型;利用緩存池技術,在通信的過程中,通常需要頻繁的申請和釋放記憶體緩沖區,建立了動态緩存池, 隻有當緩存池中沒有可用對象時才建立新對象,而當緩存對象過多時則會壓縮緩存池;另外,元件的動态記憶體通過私有堆(private heap)機制配置設定,避免與 new / malloc 競争同時又減少記憶體空洞。

agent:對于代理伺服器或中轉伺服器等應用場景,伺服器自身也作為用戶端向其它伺服器發起大規模連接配接,一個 agent 元件對象管理多個 socket 連接配接,與服務端采用相同的技術架構,可以用作代理伺服器或中轉伺服器的用戶端部件。

伸縮性

  可以根據實際的使用環境要求設定元件的各項性能參數(如:工作線程的數量、各種緩存池的大小、收發緩沖區的大小、socket 監聽隊列的大小、accep 派發的數目以及心跳檢查的間隔等)。

   (項目首頁:,下載下傳位址:)

*** v3.2.1 更新 ***

 > 增加 tcpagent / tcppullagent 通信元件:

-----------------

對于代理伺服器或中轉伺服器等應用場景,伺服器自身也作為用戶端向其它伺服器發起大規模連接配接

tcpclient / tcppullclient 基于 event select 通信模型,每個元件對象管理一個 socket,并開啟一個線程,不适合上述應用場景

tcpagent / tcppullagent 基于 iocp 通信模型,一個元件對象管理多個 socket,适合用作代理伺服器或中轉伺服器的用戶端通信元件

tcpagent / tcppullagent 的使用方式依然簡單,提供以下接口方法:

增加 tcpagent / tcppullagent 使用示例:agent-pfm / agent-pull / agent-4c

高性能 Socket 元件 HP-Socket v3.2.1-RC2 釋出

> 增加 hpsocket for java sdk:

提供 java 開發包:hpsocket-3.2.1.jar(通過 jna 實作,目前隻支援 windows 平台)

運作環境:jdk 1.6+,jvm 運作在 server 模式("java -server",在 client 模式下性能受影響)

mbcs 和 unicode 版本分布位于包 org.jessma.hpsocket.mbcs 和 org.jessma.hpsocket.unicode

hpsocket for java sdk 提供以下通信元件:

hpsocket4j 的使用方法(以 tcpagent 為例):

增加示例工程 testecho-4j,展示 hpsocket4j 的使用方法(包括 pull 模型示例和性能測試示例)

高性能 Socket 元件 HP-Socket v3.2.1-RC2 釋出

> 優化資料發送政策:

iclient/iserver/iagent 元件的 send() 方法不直接把資料投遞到完成端口

在高負載情形下,資料會放入發送隊列,并進行資料包合并,避免高負載下發生 10055 錯誤

當發送大量小資料包時,自動組包機制能大大提高發送效率

應用程式可以通過 getpendingdatalength() 擷取隊列中未發出的資料,進而實作流量控制

> 其它更新:

iserver 的 getclientaddress() 方法改名為 getremoteaddress()

iclient 的 send() 方法删除 “connid dwconnid” 參數

iclient/iserver/iagent 的 send() 方法增加發送資料緩沖區指針偏移量參數 “int ioffset”

enservererror / enclienterror 枚舉類型合并為 ensocketerror

ensocketerror / enhandleresult / enfetchresult 枚舉類型從原所在類中移到外部

iclient/iserver/iagent 增加方法:bool getpendingdatalength(),擷取連接配接中未發出資料的長度

hpsocket4c.dll 增加方法 sendpart(),支援指定緩沖區指針偏移量

增加 hpsocket for c# sdk(由 int 2e 提供)

公共代碼包 vc-common-src 更新為 v2.3.4(參考:vc-common-src v2.3.4 的 change log)

> 更新說明:

hp-socket v3.2.1 在功能上相容 hp-socket v3.1.3 及以前版本

接口有變化,需要根據提示修改程式代碼;注意:現有程式不能直接替換 v3.1.3 的 dll

enservererror / enclienterror 枚舉類型合并為 ensocketerror,注意一些枚舉值發生了變化

*** v3.1.3 更新 ***

 > 增加其它語言 demo:

c#

delphi

e 語言

> bug fix:

修複 ip 位址判斷錯誤 bug

修複域名或主機名的 ip 位址解析錯誤 bug

*** v3.1.2 更新 ***

 > 修改 server 元件的 onclose() / onerror() 事件的觸發規則:

以前版本的 tcp/udp server 元件中,當關閉一個連接配接時可能會同時觸發一個 onclose() 事件和若幹個 onerror() 事件

由于存在上述可能性,是以應用程式需要對 onclose() / onerror() 的處理事件代碼段進行同步

從 v3.1.2 開始,當多個 onclose() / onerror() 事件同時發生時,元件隻會向應用程式通知第一個事件,後續事件則忽略

是以,應用程式在處理 onclose() / onerror() 事件時不必處理同步,減少了出錯的可能和編寫同步及檢測代碼的負擔

示例代碼

*** v3.1.1 更新 ***

 > 增加導出純 c 函數的動态連結庫 hpsocket4c.dll:

增加代碼檔案 hpsocket4c.h 和 hpsocket4c.cpp,用于建立 hpsocket4c.dll

導出純 c 函數,讓其它語言(如:c/c#/delphi 等)能友善地使用 hpsocket

hpsocket4c.dll 使用方法

動态連結庫發行版本

> 全面啟用 buffer pool 緩存機制:

common/src 增加代碼檔案 bufferpool.h 和 bufferpool.cpp,實作 buffer pool 緩存機制

通過 buffer pool 緩存機制提升記憶體使用效率,減少動态記憶體配置設定和釋放操作,避免記憶體空洞

ictcpclient 用 citempool 和 titemlist 實作發送緩沖區

cudpclient 用 citempool 和 titemlist 實作發送緩沖區

ctcppullclient 用 citempool 和 titemlist 實作發送緩沖區和 pull 緩沖區

ctcppullserver 用 cbufferpool 和 tbuffer 實作 pull 緩沖區

*** v3.0.2 更新 ***

 > 把 hp-socket 編譯為動态連結庫:

應用程式可以通過導入源代碼或動态連結庫方式使用 hp-socket

動态連結庫使用方法

*** v3.0.1 更新 ***

 > 新增 udp 通信元件:

新增兩個 udp 通信元件:cudpserver 為服務端元件,cudpclient 為用戶端元件

服務端元件 cudpserver 采用 iocp 通信模型

用戶端元件 cudpclient 采用 event select 通信模型

udp 通信元件的接口與原 tcp 通信元件一緻,簡單實用

udp 通信元件内置通信線路自動監測機制

新增 udp 通信元件示例工程 testecho-udp

> 代碼重構與優化:

規範所有接口、類以及代碼檔案的命名

重構和優化了大量元件代碼

服務端元件加入讀寫鎖機制,有效平衡處理性能與安全性

服務端元件的 socket 對象緩存清單設定了鎖定時間,提高通路的安全性

繼續閱讀