轻量级网络引擎styleman_network
styleman_network网络引擎v1.0简要说明:
本网络引擎100%保证数据包完整性,程序健壮无bug,无内存泄露,而且是线程安全的.获取地址
1.http://download.csdn.net/source/3168015
2.qq群 10072269
styleman_network网络引擎v1.0简要说明:
本网络引擎100%保证数据包完整性,程序健壮无bug,无内存泄露,而且是线程安全的.获取地址
1.http://download.csdn.net/source/3168015
2.qq群 10072269
解决方案 »
- 关于 resource.h 里面有很多重复的宏定义
- ●高手请进》》如何保存网页及相关图片,flash,mid,脚本
- 需要《VC高级》的近来
- 如何改变属性页或向导(CPropertySheet)的标题文字
- VC+ORACLE问题:VC程序用ODBC操作ORACLE数据库里的一张表和操作用PB连接该ORACLE数据库并另存该表为一DBF文件 会有何区别?
- 重(分)求图形报表,只要简要介绍就行,本人想对图形报表作份分析
- 如何从CDialog中派生一个新的CMyDialog类,使这个新类能够再派生出别的类?
- 如何取得当前鼠标的位置?
- 在一个CWinThread派生类创建窗口为什么总报警告错误
- vc++2005中 MSChart怎么用?
- 见鬼了,早上在拖了些控件到对话框,结果编译就报错了。
- 求助 wince6 播放视频
/*
服务端网络引擎接口
*/
/************************************************************************/
//回调处理数据函数原型
typedef VOID WINAPI ServerProcessRecvData( DWORD dwNetworkIndex , BYTE *pMsg , WORD wSize );class INetEngine
{
public:
//virtual ~INetEngine(void)=0; //是否已初始化监听
virtual BOOL IsListening()=0; //网络初始化
virtual BOOL Init(char* IP, WORD Port , ServerProcessRecvData* pProcessRecvData , DWORD MaxConnectNum )=0; //停止网络服务
virtual VOID Shutdown()=0; //网络更新
virtual VOID Update()=0; //单个断开
virtual BOOL DisConnect( DWORD dwNetworkIndex )=0; //指定发送
virtual BOOL Send( DWORD dwNetworkIndex , BYTE *pMsg , WORD wSize )=0;
//发送给所有
virtual BOOL SendToAll( BYTE *pMsg , WORD wSize )=0; //发送给所有,但排除except
virtual BOOL SendToOtherAll(DWORD except , BYTE *pMsg , WORD wSize )=0; //得到当前总连接数
virtual DWORD GetNumberOfConnections()=0; //得到ip
virtual char* GetIP( DWORD dwNetworkIndex )=0; //设置心跳超时.当客户超过这段时间,没有给服务器发送一包消息,就断定他断开了.
virtual void SetHeartbeatTimeOut(DWORD timeout)=0;//单位秒 //设置连接超时.当客户连接到服务端后.没有发送一包消息.超过这段时间,就把他断开.防止恶意空闲连接.
virtual void SetConnTimeOut(DWORD timeout)=0; //单位秒
};
/************************************************************************/
/*
客户端网络引擎接口*/
/************************************************************************/
//回调处理数据函数原型
typedef VOID WINAPI ClientProcessRecvData( BYTE *pMsg , WORD wSize );class INetClient
{
public:
//连接服务器
virtual BOOL Connect(const char* ServerIP, WORD Port , ClientProcessRecvData* pProcessRecvData )=0; //断开连接
virtual BOOL DisConnect( )=0; //指定发送
virtual BOOL Send( BYTE *pMsg , WORD wSize )=0;};//server socket io模型
enum eSERVER_SOCKET_IO_MODEL
{
eSELECT_THREADPOOL=0, //select+线程池
eWSASYNSELECT, //WSAAsyncSelect
};
//创建服务端网络引擎
NETWORK_API INetEngine* CreateNetEngine(eSERVER_SOCKET_IO_MODEL IO_mode,char*IP, WORD Port , ServerProcessRecvData* pProcessRecvData , DWORD MaxConnectNum );//销毁服务端网络引擎
NETWORK_API VOID DestroyNetEngine( INetEngine* net );
//创建客户端网络引擎
NETWORK_API INetClient* CreateNetClient(const char* ServerIP, WORD Port , ClientProcessRecvData* pProcessRecvData );//销毁客户端网络引擎
NETWORK_API VOID DestroyNetClient( INetClient* net );
#include <conio.h>
struct STest
{
int cmd; DWORD time;
char b[1024];
int a;
};
#include "INetEngine.h"INetEngine* net;//网络消息处理
void WINAPI RecvDataCall(DWORD dwNetworkIndex , BYTE *pMsg, WORD wSize)
{
if( wSize == 0 || pMsg == NULL ) //客户退出了
{
printf("[%d]退出\n",dwNetworkIndex );
return;
}else{ STest s;
memcpy((BYTE*)&s,pMsg,sizeof(STest));
printf("客户id[%d] ip[%s] recv size:%d a:%d 用时time:%d\n",dwNetworkIndex, net->GetIP(dwNetworkIndex), wSize,s.a , s.time ); net->Send(dwNetworkIndex,pMsg,wSize);//简单echo
}
}
INetEngine* net2;
void WINAPI RecvDataCall2(DWORD dwNetworkIndex , BYTE *pMsg, WORD wSize)
{
if( wSize == 0 || pMsg == NULL ) //客户退出了
{
printf("[%d]退出\n",dwNetworkIndex );
return;
}else{ STest s;
memcpy((BYTE*)&s,pMsg,sizeof(STest));
printf("客户id[%d] ip[%s] recv size:%d a:%d 用时time:%d\n",dwNetworkIndex, net2->GetIP(dwNetworkIndex), wSize,s.a , s.time ); net2->Send(dwNetworkIndex,pMsg,wSize);//简单echo }
}//-------------------------------------------------------------------------------------------------
// Main
//-------------------------------------------------------------------------------------------------
int _tmain(int argc, _TCHAR* argv[])
{
int port=123;
net= CreateNetEngine(eSELECT_THREADPOOL, "0.0.0.0" ,port,RecvDataCall,555); //创建网络引擎
if(net)
{
printf("CreateNetEngine eSELECT_THREADPOOL ok! listen [%d] ok\n",port);
}else{
printf("CreateNetEngine eSELECT_THREADPOOL err! listen err\n");
return 0;
} net2= CreateNetEngine(eWSASYNSELECT, "0.0.0.0" ,port+1,RecvDataCall2,2000); //创建网络引擎
if(net2)
{
printf("CreateNetEngine eWSASYNSELECT ok! listen [%d] ok\n",port+1);
}else{
printf("CreateNetEngine eWSASYNSELECT err! listen err\n");
return 0;
}
printf("按任意键退出\n"); DWORD last=::GetTickCount();
while( net->IsListening() )
{
if (kbhit())
{
break;
} Sleep(10);
net->Update();
net2->Update(); if(GetTickCount()-last>2000)
{
last=GetTickCount(); printf("1有[%d]个客户连接 2有[%d]个客户连接\n",net->GetNumberOfConnections() ,net2->GetNumberOfConnections() );
}
} printf("销毁网络引擎中!~\n"); DestroyNetEngine(net);//销毁网络引擎
DestroyNetEngine(net2);//销毁网络引擎
printf("DestroyNetEngine完毕\n"); return 0;
}