高性能网络框架
描述
- 服务器 基于IOCP/EPOLL通信模型,结合内存池、私有堆等技术,实现高效的内存管理,支持大规模和高并发通信场景。
- 代理 代理组件本质上是一个多客户端组件,使用与服务器组件相同的技术架构。一个代理组件对象可以同时创建和高效处理大规模的Socket连接。
- 客户端 基于Event-Select/POLL通信模型,每个组件对象创建一个通信线程并管理一个Socket连接。客户端组件适用于小规模客户端场景。
文档
- HP-Socket开发指南 [pdf]
- HP-Socket类图 [uml]
- HP-Socket类图 [jpg]
- HP-Socket SSL类图 [jpg]
- HP-Socket HTTP类图 [jpg]
工作流程
- 创建监听器对象
- 创建组件对象(并与监听器对象绑定)
- 启动组件对象
- 连接到目标主机(仅适用于代理组件)
- 处理网络事件(OnConnect/OnReceive/OnClose等)
- 停止组件对象(可选:在第7步销毁之前,组件对象将被停止)
- 销毁组件对象
- 销毁监听器对象
示例
- C++示例
#include <hpsocket/HPSocket.h>
/* 监听器类 */
class CListenerImpl : public CTcpPullServerListener
{
public:
// 5. 处理网络事件
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. 创建监听器对象
CListenerImpl s_listener;
// 2. 创建组件对象(并与监听器对象绑定)
CTcpPullServerPtr s_pserver(&s_listener);
// 3. 启动组件对象
if(!s_pserver->Start("0.0.0.0", 5555))
exit(1);
/* 等待退出 */
// ... ...
// 6. (可选)停止组件对象
s_pserver->Stop();
return 0;
// 7. 自动销毁组件对象
// 8. 自动销毁监听器对象
}
- C示例
#include <hpsocket/HPSocket4C.h>
// 5. 处理网络事件
EnHandleResult __HP_CALL OnConnect(HP_Agent pSender, HP_CONNID dwConnID);
EnHandleResult __HP_CALL OnReceive(HP_Agent pSender, HP_CONNID dwConnID, int iLength);
EnHandleResult __HP_CALL OnSend(HP_Agent pSender, HP_CONNID dwConnID, const BYTE* pData, int iLength);
EnHandleResult __HP_CALL OnClose(HP_Agent pSender, HP_CONNID dwConnID, En_HP_SocketOperation enOperation, int iErrorCode);
EnHandleResult __HP_CALL OnShutdown(HP_Agent pSender);
int main(int argc, char* const argv[])
{
HP_TcpPullAgentListener s_listener;
HP_TcpPullAgent s_agent;
// 1. 创建监听器对象
s_listener = ::Create_HP_TcpPullAgentListener();
// 2. 创建组件对象(并与监听器对象绑定)
s_agent = ::Create_HP_TcpPullAgent(s_listener);
/* 设置监听器回调 */
::HP_Set_FN_Agent_OnConnect(s_listener, OnConnect);
::HP_Set_FN_Agent_OnSend(s_listener, OnSend);
::HP_Set_FN_Agent_OnPullReceive(s_listener, OnReceive);
::HP_Set_FN_Agent_OnClose(s_listener, OnClose);
::HP_Set_FN_Agent_OnShutdown(s_listener, OnShutdown);
// 3. 启动组件对象
if(!::HP_Agent_Start(s_agent, "0.0.0.0", TRUE))
exit(1);
// 4. 连接目标主机
::HP_Agent_Connect(s_agent, REMOTE_HOST_1, REMOTE_PORT_1, nullptr);
::HP_Agent_Connect(s_agent, REMOTE_HOST_2, REMOTE_PORT_2, nullptr);
::HP_Agent_Connect(s_agent, REMOTE_HOST_3, REMOTE_PORT_3, nullptr);
/* 等待退出 */
// ... ...
// 6. (可选)停止组件对象
::HP_Agent_Stop(s_agent);
// 7. 销毁组件对象
::Destroy_HP_TcpPullAgent(s_agent);
// 8. 销毁监听器对象
::Destroy_HP_TcpPullAgentListener(s_listener);
return 0;
}
## 组件列表
- ***基础组件***
![基础组件](https://raw.githubusercontent.com/ldcsaa/HP-Socket/dev/Doc/Basic%20Component%20-%20mini.jpg "基础组件")
- ***SSL组件***
![SSL组件](https://raw.githubusercontent.com/ldcsaa/HP-Socket/dev/Doc/SSL%20Component%20-%20mini.jpg "SSL组件")
- ***HTTP组件***
![HTTP组件](https://raw.githubusercontent.com/ldcsaa/HP-Socket/dev/Doc/HTTP%20Component%20-%20mini.jpg "HTTP组件")
## 参考项目
- *[mimalloc](https://github.com/microsoft/mimalloc)*
- *[jemalloc](https://github.com/jemalloc/jemalloc)*
- *[openssl](https://github.com/openssl/openssl)*
- *[llhttp](https://github.com/nodejs/llhttp)*
- *[zlib](https://github.com/madler/zlib)*
- *[brotli](https://github.com/google/brotli)*
- *[kcp](https://github.com/skywind3000/kcp)*
## 扩展项目
- *[HP-Socket for MacOS](https://gitee.com/xin_chong/HP-Socket-for-macOS)*
- *[HP-Socket for .Net](https://gitee.com/int2e/HPSocket.Net)*
## 技术交流群
- *[QQ群 - 1](https://jq.qq.com/?_wv=1027&k=3UAbrhTG)*
- *[QQ群 - 2](https://jq.qq.com/?_wv=1027&k=uYBpc6bG)*