HP-Socket是一套通用的高性能TCP/UDP/HTTP 通信框架,包含服務端組件、客戶端組件和Agent組件,廣泛適用于各種不同應用場景的TCP/UDP/HTTP通信系統,提供C/C++、C#、Delphi、E(易語言)、Java、Python等編程語言介面。HP-Socket對通信層完全封裝,應用程式不必關注通信層的任何細節;HP-Socket提供基于事件通知模型的API介面,能非常簡單高效地整合到新舊應用程式中
一.首先了解三種傳輸模型的原理作用
由于TCP是流式套接字,所以socket收到的資料而言,可能不是一個完整的包或者粘包了。此時需要應用層來進行拆包組包了。例如客戶端連續發送了三個資料包大小分別是:300,500,100。但是接收端接受到的資料可能是200,400,100,200。所以此時我們處理接收到的資料就要進行組包和拆包了。
由于200不足一個資料包,所以需要組合下一個資料包400。此時資料大小為600,但是客戶端第一個發送的資料包是300,所以此時需要將600拆分為300+300。此時就可以得到第一個資料包300,剩余資料300,但是第二個資料包是500。資料不夠所以需要組合下一個資料100總共資料400,依然不夠一個包,繼續組包剩余的200,此時接受資料600,足夠一個資料包500,所以將600拆解為500+100。得到第二個資料包500,剩余資料100,正好和第三個資料包100匹配。此時資料包決議完畢。基本邏輯
while(true)
{
data_size = recv_data();
if(data_size < 資料包長度)
continue;//繼續接受資料
///回圈拆包,當不夠一個包的時候繼續接受資料等待一個完整的包
while(true)
{
//足夠包長度,拆包
data_size -= 資料包長度;
//更新資料緩沖區,處理包
hanle_pack(pack);
if(data_size < 資料包長度)
break;
}
}
所以綜上所述模型:
PUSH:接受到資料之后就出發OnReceive,由開發人員自己實作上述拆包和計算緩沖區的管理邏輯。
PULL:接受到資料之后就出發OnReceive,但是開發人員只需要維護資料包的長度,資料緩沖區管理HP內部幫你做了,當足夠一個包的時候,Fetch獲取一個完整的資料包就OK了。
PACK:接受到資料之后就出發OnReceive,開發人員不必管理上述的程序,OnReceive的資料就是一個完整的包。
原文鏈接:https://blog.csdn.net/CAir2/article/details/82188721
二.

三. HP-Socket提供以下幾類組件,詳細內容請參考《HP-Socket網路通信框架開發指南》:
Server:基于IOCP / EPOLL通信模型,并結合快取池、私有堆等技術實作高效記憶體管理,支持超大規模、高并發通信場景。
Agent:Agent組件實質上是Multi-Client組件,與Server組件采用相同的技術架構。一個Agent組件物件可同時建立和高效處理大規模Socket連接。
Client:基于Event Select / POLL通信模型,每個組件物件創建一個通信執行緒并管理一個Socket連接,適用于小規模客戶端場景。
四.作業流程
創建監聽器
創建通信組件(同時系結監聽器)
啟動通信組件
連接到目標主機(Agent組件)
處理通信事件(OnConnect/OnReceive/OnClose等)
停止通信組件(可選:在第7步銷毀通信組件時會自動停止組件)
銷毀通信組件
銷毀監聽器
#include <hpsocket/HPSocket.h>
/* Listener Class */
class CListenerImpl : public CTcpPullServerListener
{
public:
// 5. process network events
virtual EnHandleResult OnPrepareListen(ITcpServer* pSender, SOCKET soListen);
virtual EnHandleResult OnAccept(ITcpServer* pSender, CONNID dwConnID, UINT_PTR soClient);
virtual EnHandleResult OnHandShake(ITcpServer* pSender, CONNID dwConnID);
virtual EnHandleResult OnReceive(ITcpServer* pSender, CONNID dwConnID, int iLength);
virtual EnHandleResult OnSend(ITcpServer* pSender, CONNID dwConnID, const BYTE* pData, int iLength);
virtual EnHandleResult OnClose(ITcpServer* pSender, CONNID dwConnID, EnSocketOperation enOperation, int iErrorCode);
virtual EnHandleResult OnShutdown(ITcpServer* pSender);
};
int main(int argc, char* const argv[])
{
// 1. Create listener object
CListenerImpl s_listener;
// 2. Create component object (and binding with lis
tener object)
CTcpPullServerPtr s_pserver(&s_listener);
// 3. Start component object
if(!s_pserver->Start("0.0.0.0", 5555))
exit(1);
/* wait for exit */
// ... ...
// 6. (optional) Stop component object
s_pserver->Stop();
return 0;
// 7. Destroy component object automatically
// 8. Destroy listener object automatically
}
原文鏈接:https://blog.csdn.net/xj9120/article/details/90692812
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/38829.html
標籤:網絡通信
