轻量、稳定、高效的IOCP模型框架,支持速度统计与限速、自动拆包封包,可直接用于生产环境。
#ifndef NetNoteInterface_h__
#define NetNoteInterface_h__
#pragma once
#pragma pack(1)
struct SessionIO;
namespace net
{
enum NetEvent //网络事件枚举
{
net_START,
net_STOP,
net_CONNECT,
net_DISCONNECT,
net_RECV,
net_SEND
};
enum RetEvent //网络事件状态枚举
{
ret_SUCCESSED,
ret_ERROR,
ret_FAILED,
ret_SENDBEFORE,
};
struct NetAddr //服务器端或客户端ip与端口
{
char mAddr[32];
int mPort;
};
struct SpeedTotal //TCP通讯统计
{
INT64 m_SCurrent_Speed; //当前发送速度
INT64 m_RCurrent_Speed; //当前接收速度
INT64 m_SAverageSpeed; //平均发送速度
INT64 m_RAverageSpeed; //平均接收速度
INT64 m_Total_Send; //总发送字节数
INT64 m_Total_Recv; //总接收字节数
INT64 m_Total_SendNum; //总发送次数
INT64 m_Total_RecvNum; //总接收次数
INT64 m_Start_Tick; //开始时间
INT64 m_SLast_Tick; //最后发送数据时间
INT64 m_RLast_Tick; //最后接收数据时间
INT64 m_Elapsed_Tick; //已逝去时间或结束时间
INT m_Send_QueueLenght; //发送列队长度
INT m_Recv_QueueLenght; //接收列队长度
CHAR m_Start_Time[32]; //开始时间
CHAR m_SLast_Time[32]; //最后发送数据时间
CHAR m_RLast_Time[32]; //最后接收数据时间
CHAR m_Elapsed_Time[32]; //已逝去时间或结束时间
};
//网络事件接口
typedef class NetNoteInterface
{
public:
virtual NetNoteInterface* createNetNote(){return NULL;};//作为服务器节点接口时才有效,在此方法实例化客户端对象,一般为自身
virtual void OnNetNotify(const char* _data,int _len,NetEvent _NetEvent,RetEvent _RetEvent,SessionIO* _Session){};//网络事件通知
virtual void OnNetNotify(const char* _data,int _len,NetEvent _NetEvent,RetEvent _RetEvent,NetNoteInterface* _NetNote){};//网络事件通知
virtual void OnNetNotify(const char* _data,int _len,NetEvent _NetEvent,RetEvent _RetEvent,int _NetIndex){};//网络事件通知
virtual void SpeedTotalNotify(SpeedTotal _SpeedTotal){};//速度统计通知
public:
NetAddr mNetAddr;//当前节点IP地址和端口,由类库填充
}CNetNote;
//网络通信类库接口,服务器端与客户端合并为一个对象
class CNetLibInterface
{
public:
//初始化为服务器对象
virtual void InitServer(bool _ConsoleLog = true,const char* _LogFilePath = "") = 0;
//初始化为客户端对象
virtual void InitClient(bool _ConsoleLog = true,const char* _LogFilePath = "") = 0;
//启动服务器端监听,为服务器端对象时生效
virtual void StartServer(net::CNetNote* _NetNote,int _Port,char* _Addr = NULL,bool _EnableSpeedTotal = false) = 0;
//停止服务器端
virtual void StopServer(void) = 0;
//限制连接数,为服务器端时生效
virtual void ConnectionLimit(int _MaxConnect = 200) = 0;
//断开指定客户端连接,为服务器端时生效
virtual void DisConnectAt(int _NetIndex) = 0;
//断开所有连接
virtual void DisConnectAll() = 0;
//获取指定客户端节点对象
virtual CNetNote* GetNetNoteAt(int _NetIndex) = NULL;
//获取指定客户端节点对象索引
virtual int GetIndexAt(CNetNote* _NetNode) = NULL;
//获取指定客户端节点对象索引
virtual int GetIndexAt(SessionIO* _SessionIO) = NULL;
//向指定节点发送数据
virtual void Send(const char* _Buff,int _Len,SessionIO* _Session) = 0;
//向指定节点发送数据
virtual void Send(const char* buf,int _len,int _NetIndex = 0) = 0;
//向指定节点发送数据
virtual void Send(const char* buf,int _len,CNetNote* _NetNotePtr) = 0;
//向指所有节点发送数据
virtual void SendToAllCli(const char* _Buff,int _Len) = 0;
//当前对象是否为客户端
virtual bool IsConnect(void) = 0;
//当前对象是否为服务器端
virtual bool IsStarted(void) = 0;
//连接服务器端,为客户端时生效
virtual void Connect(net::CNetNote* _NotePtr,char* _IpAddr,int _Port,bool _EnableSpeedTotal = false) = 0;
//当前连接数
virtual int GetConnectCount(void) = 0;
//开启速度统计,并设置速度统计间隔
virtual bool StartSpeedTotal(UINT _DelaySetp) = 0;
//关闭速度统计
virtual void StopSpeedTotal(void) = 0;
//发送与接收的限速设置
virtual void SetSpeedLimit(int _Sbytes = 0,int _Rbytes = 0) = 0;
//设置缓冲池最大列队数
virtual void SetMaxCacheQueue(int _MaxCacheQueue) = 0;
};
typedef net::CNetLibInterface CNetworkLib;
//服务器端对象
class CNetServerInterface
{
public:
virtual void InitServer(bool _Console = true,string _LogFilePath = "") = 0;
virtual void StartServer(net::CNetNote* _NetNote,int _Port,char* _Addr = NULL,bool _EnableSpeedTotal = false) = 0;
virtual void StopServer() = 0;
virtual void ConnectionLimit(int _MaxConnect = 200) = 0;
virtual void Send(const char* _Buff,int _Len,SessionIO* _Session) = 0;
virtual void Send(const char* _Buff,int _Len,net::NetNoteInterface* _NetNode) = 0;
virtual void Send(const char* _Buff,int _Len,int _NetIndex) = 0;
virtual void SendToAllCli(const char* _Buff,int _Len) = 0;
virtual void DisConnectAt(int _NetIndex) = 0;
virtual void DisConnectAt(SessionIO* _Session) = 0;
virtual void DisConnectAll() = 0;
virtual int GetConnectCount() = 0;
virtual int GetIndexAt(CNetNote* _NetNode) = NULL;
virtual int GetIndexAt(SessionIO* _SessionIO) = NULL;
virtual SessionIO* GetAt(int _NetIndex) = NULL;
virtual SessionIO* GetAt(net::NetNoteInterface* _NetNote) = NULL;
virtual bool IsStarted(void) = 0;
virtual bool StartSpeedTotal(UINT _DelaySetp) = 0;
virtual void StopSpeedTotal(void) = 0;
virtual void SetSpeedLimit(int _Sbytes = 0,int _Rbytes = 0) = 0;
virtual void SetMaxCacheQueue(int _MaxCacheQueue) = 0;
};
typedef net::CNetServerInterface CNetServerLib;
//客户端对象
class CNetClientInterface
{
public:
virtual void InitClient(bool _Console = true,string _LogFilePath = "") = 0;
virtual void Connect(net::CNetNote* _NotePtr,char* _Addr,int _Port,bool _EnableSpeedTotal = false) = 0;
virtual bool IsConnected(void) = 0;
virtual void DisConnect() = 0;
virtual void Send(const char* _Buff,int _Len) = 0;
virtual bool StartSpeedTotal(UINT _DelaySetp) = 0;
virtual void StopSpeedTotal(void) = 0;
virtual void SetSpeedLimit(int _Sbytes = 0,int _Rbytes = 0) = 0;
virtual void SetMaxCacheQueue(int _MaxCacheQueue) = 0;
};
typedef net::CNetClientInterface CNetClientLib;
//HTTP客户端对象
class CHttpClientLib
{
public:
//向指定URL发送请求,并返回HTML源码
virtual int SendRequest( string url,string& pszResultHtmlSrc,bool IsPost = false ) = 0;
//向指定URL发送请求,并返回HTML源码
virtual int SendRequest( string url,string& pszResultHtmlSrc,string& pszResultHtmlHeaderReceive,bool IsPost = false ) = 0;
//向指定URL发送请求,并返回HTML源码
virtual int SendRequest( string url,string& pszResultHtmlSrc, string& pszResultHtmlHeaderReceive, string& pszResultHtmlHeaderSend,bool IsPost = false ) = 0;
//正则匹配函数,该正则为ATL正则匹配
virtual int MatchString(string _StringSrc,string _ParseStr,vector<string>& _pszResult) = 0;
};
#endif
//通过模板封装网络通信接口,以达到使用更灵活及方便的目的
template<class T>
class CNetworkCore
{
public:
CNetworkCore( T* _NetNote,CNetworkLib* _pNetworkLib = getNetworkLib())
{
pNetLib = _pNetworkLib;
pNodePtr = _NetNote;
}
~CNetworkCore( void )
{
delete pNetLib;
pNetLib = NULL;
}
public:
void StartServer( int _Port,char* _Addr = NULL,bool _EnableSpeedTotal = false )
{
pNetLib->StartServer((CNetNote*)pNodePtr,_Port,_Addr,_EnableSpeedTotal);
}
void Connect( char* _IpAddr,int _Port,bool _EnableSpeedTotal = false )
{
pNetLib->Connect((CNetNote*)pNodePtr,_IpAddr,_Port,_EnableSpeedTotal);
}
T* GetNodePtr( int _NetIndex )
{
return (T*)pNetLib->GetNetNoteAt(_NetIndex);
}
T* GetDefaultNotePtr()
{
return pNodePtr;
}
int GetIndexAt(CNetNote* _NetNode)
{
return pNetLib->GetIndexAt(_NetNode);
}
int GetIndexAt(SessionIO* _SessionIO)
{
return pNetLib->GetIndexAt(_SessionIO);
}
void StopServer( void )
{
pNetLib->StopServer();
}
void ConnectionLimit( int _MaxConnect = 200 )
{
pNetLib->ConnectionLimit(_MaxConnect);
}
void DisConnectAt( int _NetIndex )
{
pNetLib->DisConnectAt(_NetIndex);
}
void DisConnectAll()
{
pNetLib->DisConnectAll();
}
void Send( const char* _Buff,int _Len,SessionIO* _Session )
{
pNetLib->Send(buf,_len,_Session);
}
void Send( const char* buf,int _len,int _NetIndex = 0 )
{
pNetLib->Send(buf,_len,_NetIndex);
}
void Send( const char* buf,int _len,T* _NetNotePtr)
{
pNetLib->Send(buf,_len,(CNetNote*)_NetNotePtr);
}
void SendToAllCli(const char* _Buff,int _Len)
{
pNetLib->SendToAllCli(_Buff,_Len);
}
bool IsConnect( void )
{
return pNetLib->IsConnect();
}
bool IsStarted(void)
{
return pNetLib->IsStarted();
}
int GetConnectCount( void )
{
return pNetLib->GetConnectCount();
}
bool StartSpeedTotal( UINT _DelaySetp )
{
return pNetLib->StartSpeedTotal(_DelaySetp);
}
void StopSpeedTotal( void )
{
pNetLib->StopSpeedTotal();
}
void SetSpeedLimit( int _Sbytes = 0,int _Rbytes = 0 )
{
pNetLib->SetSpeedLimit(_Sbytes,_Rbytes);
}
void SetMaxCacheQueue( int _MaxCacheQueue )
{
pNetLib->SetMaxCacheQueue(_MaxCacheQueue);
}
CNetworkLib* GetNetworkLib()
{
return pNetLib;
}
void SetNetworkLib(CNetworkLib* _pNetworkLib)
{
pNetLib = _pNetworkLib;
}
private:
CNetLibInterface* pNetLib;
T* pNodePtr;
};
}
#pragma pack()
#endif // NetNoteInterface_h__
使用例子
int main(void)
{
CNetworkCore<CNetworkNodes> mServer(new CNetworkNodes());
mServer->StartServer(16580,NULL,true);
while(1)
Sleep(100);
return 0
}
下载地址
http://download.csdn.net/detail/ipanke/4494864
相关推荐
nginx的Windows移植版
**zlib1.dll**:这是Zlib库的Windows版本,用于支持HTTP压缩,能够减少网络传输的数据量,提高页面加载速度。4.
C# HttpClient批量下载图片实战:并发控制与生产集成
HttpClient 是 .NET 中高性能 HTTP 客户端的核心组件,其连接复用、异步支持和可配置性使其成为批量下载任务的首选。理解其底层原理(如连接池、DNS 缓存、TLS 复用)是实现可控并发下载的基础;结合 SemaphoreSlim 进行线程安全的并发限流,能有效规避服务端限流与资源耗尽风险。该技术广泛应用于 OCR 结果落地、工业视觉快照拉取、Web 爬虫图片采集等场景,具备高嵌入性、低耦合性和强可观测性。本文聚焦 C# 图片批量下载的工程化实现,涵盖 DownloadOptions 参数调优
NDM下载器:现代C++实现的HTTP多线程断点续传引擎
HTTP多线程下载与断点续传是提升大文件传输效率的基础网络技术,其核心在于对TCP连接生命周期、Range分片策略及ETag校验机制的精细化控制。传统工具依赖COM组件或粗粒度线程池,易受浏览器架构变更和系统策略限制;而现代方案需支持HTTP/2多路复用、TLS会话复用、动态水位线分片及二进制指纹校验等能力,以适配CDN限速、对象存储、AI模型分发等复杂场景。NDM作为开源C++实现,将这些原理工程化落地,提供单文件部署、零注册表侵入、完整CLI接口与可嵌入SDK,成为科研下载、开源项目集成与自动化工作流中
蒙古国寺庙shp信息点wgs84.zip
蒙古国寺庙shp信息点wgs84.zip
【电力系统状态估计与PMU(相量测量单元)】使用WLS和PMU来估计系统的电压幅值和角度还将这些值与使用Newton-Raphson方法获得的状态进行比较(Matlab代码实现)
内容概要:本文系统阐述了基于加权最小二乘法(WLS)融合相量测量单元(PMU)量测数据进行电力系统状态估计的理论与实现方法,重点研究了如何利用PMU提供的高精度、高同步性的电压和电流相量信息,构建精确的量测方程,并将其集成到传统的WLS状态估计算法中,以实现对系统节点电压幅值和相角的高精度估计。文中详细描述了WLS-PMU联合估计模型的数学推导过程,包括状态变量定义、量测函数建立、雅可比矩阵计算及迭代求解流程,并通过Matlab编程实现了该算法。研究进一步将WLS-PMU的估计结果与基于传统SCADA量测和牛顿-拉夫森(Newton-Raphson)潮流计算的状态估计结果进行对比分析,通过仿真验证了PMU的引入能显著提升状态估计的精度、收敛速度和抗噪声能力,为现代电力系统的高精度实时监控与安全分析提供了有效的技术手段。; 适合人群:具备电力系统分析、现代控制理论基础,熟悉状态估计、潮流计算原理,并能熟练运用Matlab进行仿真实验的电气工程专业高年级本科生、研究生及从事电力系统自动化、智能电网相关领域的科研人员和技术工程师。; 使用场景及目标:① 掌握融合PMU量测的WLS状态估计模型的完整构建方法与理论依据;② 学习并掌握在Matlab环境中实现WLS算法及Newton-Raphson潮流计算的具体编程技巧与仿真流程;③ 通过定量对比分析,深入理解PMU在提升电网可观测性、增强状态估计鲁棒性方面的核心价值与技术优势。; 阅读建议:建议读者在阅读时紧密结合所提供的Matlab代码,逐行分析算法实现细节,特别是PMU量测方程的处理、权重矩阵的设定以及WLS迭代过程的逻辑。鼓励通过修改系统参数(如网络拓扑、PMU配置数量与位置)、引入不同程度的量测噪声等方式进行扩展性仿真实验,以直观感受不同因素对估计性能的影响,从而深化对状态估计理论精髓的理解。


非技术类
