📄 socketengine.cpp
字号:
//效验数据
WORD wPacketSize=pHead->CmdInfo.wDataSize;
if (wPacketSize>SOCKET_BUFFER) throw TEXT("数据包超长");
if (wPacketSize<sizeof(CMD_Head)) throw TEXT("数据包非法");
if (pHead->CmdInfo.cbMessageVer!=SOCKET_VER) throw TEXT("数据包版本错误");
if (m_wRecvSize<wPacketSize) break;
//提取数据
CopyMemory(cbBuffer,m_cbRecvBuf,wPacketSize);
WORD wRealySize=CrevasseBuffer(cbBuffer,wPacketSize);
ASSERT(wRealySize>=sizeof(CMD_Head));
m_dwRecvPacketCount++;
//解释数据
WORD wDataSize=wRealySize-sizeof(CMD_Head);
void * pDataBuffer=cbBuffer+sizeof(CMD_Head);
CMD_Command Command=((CMD_Head *)cbBuffer)->CommandInfo;
//内核命令
if (Command.wMainCmdID==MDM_KN_COMMAND)
{
switch (Command.wSubCmdID)
{
case SUB_KN_DETECT_SOCKET: //网络检测
{
break;
}
default: throw TEXT("非法命令码");
}
}
else
{
//消息处理
m_pIServerSocketItemSink->OnSocketReadEvent(Command,pDataBuffer,wDataSize,this);
}
//删除缓存数据
m_wRecvSize-=wPacketSize;
MoveMemory(m_cbRecvBuf,m_cbRecvBuf+wPacketSize,m_wRecvSize);
}
}
catch (...)
{
CloseSocket(m_wRountID);
return false;
}
return RecvData();
}
//关闭完成通知
bool CServerSocketItem::OnCloseCompleted()
{
//效验状态
ASSERT(m_hSocket==INVALID_SOCKET);
ASSERT(m_OverLappedSendActive.GetCount()==0);
//关闭事件
ASSERT(m_bNotify==false);
if (m_bNotify==false)
{
m_bNotify=true;
m_pIServerSocketItemSink->OnSocketCloseEvent(this);
}
//状态变量
ResetSocketData();
return true;
}
//加密数据
WORD CServerSocketItem::EncryptBuffer(BYTE pcbDataBuffer[], WORD wDataSize, WORD wBufferSize)
{
//效验参数
ASSERT(wDataSize>=sizeof(CMD_Head));
ASSERT(wDataSize<=(sizeof(CMD_Head)+SOCKET_PACKAGE));
ASSERT(wBufferSize>=(wDataSize+2*sizeof(DWORD)));
//调整长度
WORD wEncryptSize=wDataSize-sizeof(CMD_Info),wSnapCount=0;
if ((wEncryptSize%sizeof(DWORD))!=0)
{
wSnapCount=sizeof(DWORD)-wEncryptSize%sizeof(DWORD);
memset(pcbDataBuffer+sizeof(CMD_Info)+wEncryptSize,0,wSnapCount);
}
//效验码与字节映射
BYTE cbCheckCode=0;
for (WORD i=sizeof(CMD_Info);i<wDataSize;i++)
{
cbCheckCode+=pcbDataBuffer[i];
pcbDataBuffer[i]=MapSendByte(pcbDataBuffer[i]);
}
//填写信息头
CMD_Head * pHead=(CMD_Head *)pcbDataBuffer;
pHead->CmdInfo.cbCheckCode=~cbCheckCode+1;
pHead->CmdInfo.wDataSize=wDataSize;
pHead->CmdInfo.cbMessageVer=SOCKET_VER;
//加密数据
DWORD dwXorKey=m_dwSendXorKey;
WORD * pwSeed=(WORD *)(pcbDataBuffer+sizeof(CMD_Info));
DWORD * pdwXor=(DWORD *)(pcbDataBuffer+sizeof(CMD_Info));
WORD wEncrypCount=(wEncryptSize+wSnapCount)/sizeof(DWORD);
for (i=0;i<wEncrypCount;i++)
{
*pdwXor++^=dwXorKey;
dwXorKey=SeedRandMap(*pwSeed++);
dwXorKey|=((DWORD)SeedRandMap(*pwSeed++))<<16;
dwXorKey^=g_dwPacketKey;
}
//设置变量
m_dwSendPacketCount++;
m_dwSendXorKey=dwXorKey;
return wDataSize;
}
//解密数据
WORD CServerSocketItem::CrevasseBuffer(BYTE pcbDataBuffer[], WORD wDataSize)
{
//效验参数
ASSERT(wDataSize>=sizeof(CMD_Head));
ASSERT(((CMD_Head *)pcbDataBuffer)->CmdInfo.wDataSize==wDataSize);
//调整长度
WORD wSnapCount=0;
if ((wDataSize%sizeof(DWORD))!=0)
{
wSnapCount=sizeof(DWORD)-wDataSize%sizeof(DWORD);
memset(pcbDataBuffer+wDataSize,0,wSnapCount);
}
//提取密钥
if (m_dwRecvPacketCount==0)
{
ASSERT(wDataSize>=(sizeof(CMD_Head)+sizeof(DWORD)));
if (wDataSize<(sizeof(CMD_Head)+sizeof(DWORD))) throw TEXT("数据包解密长度错误");
m_dwRecvXorKey=*(DWORD *)(pcbDataBuffer+sizeof(CMD_Head));
m_dwSendXorKey=m_dwRecvXorKey;
MoveMemory(pcbDataBuffer+sizeof(CMD_Head),pcbDataBuffer+sizeof(CMD_Head)+sizeof(DWORD),
wDataSize-sizeof(CMD_Head)-sizeof(DWORD));
wDataSize-=sizeof(DWORD);
((CMD_Head *)pcbDataBuffer)->CmdInfo.wDataSize-=sizeof(DWORD);
}
//解密数据
DWORD dwXorKey=m_dwRecvXorKey;
DWORD * pdwXor=(DWORD *)(pcbDataBuffer+sizeof(CMD_Info));
WORD * pwSeed=(WORD *)(pcbDataBuffer+sizeof(CMD_Info));
WORD wEncrypCount=(wDataSize+wSnapCount-sizeof(CMD_Info))/4;
for (WORD i=0;i<wEncrypCount;i++)
{
if ((i==(wEncrypCount-1))&&(wSnapCount>0))
{
BYTE * pcbKey=((BYTE *)&m_dwRecvXorKey)+sizeof(DWORD)-wSnapCount;
CopyMemory(pcbDataBuffer+wDataSize,pcbKey,wSnapCount);
}
dwXorKey=SeedRandMap(*pwSeed++);
dwXorKey|=((DWORD)SeedRandMap(*pwSeed++))<<16;
dwXorKey^=g_dwPacketKey;
*pdwXor++^=m_dwRecvXorKey;
m_dwRecvXorKey=dwXorKey;
}
//效验码与字节映射
CMD_Head * pHead=(CMD_Head *)pcbDataBuffer;
BYTE cbCheckCode=pHead->CmdInfo.cbCheckCode;;
for (i=sizeof(CMD_Info);i<wDataSize;i++)
{
pcbDataBuffer[i]=MapRecvByte(pcbDataBuffer[i]);
cbCheckCode+=pcbDataBuffer[i];
}
if (cbCheckCode!=0) throw TEXT("数据包效验码错误");
return wDataSize;
}
//////////////////////////////////////////////////////////////////////////
//构造函数
CServerSocketRSThread::CServerSocketRSThread(void)
{
m_hCompletionPort=NULL;
}
//析构函数
CServerSocketRSThread::~CServerSocketRSThread(void)
{
}
//配置函数
bool CServerSocketRSThread::InitThread(HANDLE hCompletionPort)
{
ASSERT(hCompletionPort!=NULL);
m_hCompletionPort=hCompletionPort;
return true;
}
//运行函数
bool CServerSocketRSThread::RepetitionRun()
{
//效验参数
ASSERT(m_hCompletionPort!=NULL);
//变量定义
DWORD dwThancferred=0;
OVERLAPPED * pOverLapped=NULL;
COverLapped * pSocketLapped=NULL;
CServerSocketItem * pServerSocketItem=NULL;
//等待完成端口
BOOL bSuccess=GetQueuedCompletionStatus(m_hCompletionPort,&dwThancferred,(PULONG_PTR)&pServerSocketItem,&pOverLapped,INFINITE);
if ((bSuccess==FALSE)&&(GetLastError()!=ERROR_NETNAME_DELETED)) return false;
if ((pServerSocketItem==NULL)&&(pOverLapped==NULL)) return false;
//处理操作
ASSERT(pOverLapped!=NULL);
ASSERT(pServerSocketItem!=NULL);
pSocketLapped=CONTAINING_RECORD(pOverLapped,COverLapped,m_OverLapped);
switch (pSocketLapped->GetOperationType())
{
case OperationType_Recv: //SOCKET 数据读取
{
COverLappedRecv * pOverLappedRecv=(COverLappedRecv *)pSocketLapped;
CThreadLockHandle SocketLockHandle(pServerSocketItem->GetSignedLock());
pServerSocketItem->OnRecvCompleted(pOverLappedRecv,dwThancferred);
break;
}
case OperationType_Send: //SOCKET 数据发送
{
COverLappedSend * pOverLappedSend=(COverLappedSend *)pSocketLapped;
CThreadLockHandle SocketLockHandle(pServerSocketItem->GetSignedLock());
pServerSocketItem->OnSendCompleted(pOverLappedSend,dwThancferred);
break;
}
}
return true;
}
//////////////////////////////////////////////////////////////////////////
//构造函数
CSocketAcceptThread::CSocketAcceptThread(void)
{
m_hCompletionPort=NULL;
m_pTCPSocketManager=NULL;
m_hListenSocket=INVALID_SOCKET;
}
//析构函数
CSocketAcceptThread::~CSocketAcceptThread(void)
{
}
//配置函数
bool CSocketAcceptThread::InitThread(HANDLE hCompletionPort, SOCKET hListenSocket, CTCPSocketEngine * pTCPSocketManager)
{
ASSERT(hCompletionPort!=NULL);
ASSERT(pTCPSocketManager!=NULL);
ASSERT(hListenSocket!=INVALID_SOCKET);
m_hListenSocket=hListenSocket;
m_hCompletionPort=hCompletionPort;
m_pTCPSocketManager=pTCPSocketManager;
return true;
}
//运行函数
bool CSocketAcceptThread::RepetitionRun()
{
//效验参数
ASSERT(m_hCompletionPort!=NULL);
ASSERT(m_pTCPSocketManager!=NULL);
//设置变量
SOCKADDR_IN SocketAddr;
CServerSocketItem * pServerSocketItem=NULL;
SOCKET hConnectSocket=INVALID_SOCKET;
int nBufferSize=sizeof(SocketAddr);
try
{
//监听连接
hConnectSocket=WSAAccept(m_hListenSocket,(SOCKADDR *)&SocketAddr,&nBufferSize,NULL,NULL);
if (hConnectSocket==INVALID_SOCKET) return false;
//获取连接
pServerSocketItem=m_pTCPSocketManager->ActiveSocketItem();
if (pServerSocketItem==NULL) throw TEXT("申请连接对象失败");
//激活对象
CThreadLockHandle SocketLockHandle(pServerSocketItem->GetSignedLock());
pServerSocketItem->Attach(hConnectSocket,SocketAddr.sin_addr.S_un.S_addr);
CreateIoCompletionPort((HANDLE)hConnectSocket,m_hCompletionPort,(ULONG_PTR)pServerSocketItem,0);
pServerSocketItem->RecvData();
}
catch (...)
{
//清理对象
ASSERT(pServerSocketItem==NULL);
if (hConnectSocket!=INVALID_SOCKET) closesocket(hConnectSocket);
}
return true;
}
//////////////////////////////////////////////////////////////////////////
//构造函数
CSocketDetectThread::CSocketDetectThread(void)
{
m_dwTickCount=0;;
m_pTCPSocketManager=NULL;
}
//析构函数
CSocketDetectThread::~CSocketDetectThread(void)
{
}
//配置函数
bool CSocketDetectThread::InitThread(CTCPSocketEngine * pTCPSocketManager)
{
//效验参数
ASSERT(pTCPSocketManager!=NULL);
//设置变量
m_dwTickCount=0L;
m_pTCPSocketManager=pTCPSocketManager;
return true;
}
//运行函数
bool CSocketDetectThread::RepetitionRun()
{
//效验参数
ASSERT(m_pTCPSocketManager!=NULL);
//设置间隔
Sleep(500);
m_dwTickCount+=500L;
//检测连接
if (m_dwTickCount>10000L)
{
m_dwTickCount=0L;
m_pTCPSocketManager->DetectSocket();
}
return true;
}
//////////////////////////////////////////////////////////////////////////
//构造函数
CTCPSocketEngine::CTCPSocketEngine(void)
{
m_bService=false;
m_wListenPort=0;
m_dwLastDetect=0;
m_wMaxSocketItem=0;
m_hCompletionPort=NULL;
m_hServerSocket=INVALID_SOCKET;
return;
}
//析构函数
CTCPSocketEngine::~CTCPSocketEngine(void)
{
//停止服务
StopService();
//释放存储连接
CServerSocketItem * pSocketItem=NULL;
for (INT_PTR i=0;i<m_StorageSocketItem.GetCount();i++)
{
pSocketItem=m_StorageSocketItem[i];
ASSERT(pSocketItem!=NULL);
SafeDelete(pSocketItem);
}
m_StorageSocketItem.RemoveAll();
return;
}
//接口查询
void * __cdecl CTCPSocketEngine::QueryInterface(const IID & Guid, DWORD dwQueryVer)
{
QUERYINTERFACE(ITCPSocketEngine,Guid,dwQueryVer);
QUERYINTERFACE(ITCPSocketEngineManager,Guid,dwQueryVer);
QUERYINTERFACE(IQueueServiceSink,Guid,dwQueryVer);
QUERYINTERFACE_IUNKNOWNEX(ITCPSocketEngine,Guid,dwQueryVer);
return NULL;
}
//设置接口
bool __cdecl CTCPSocketEngine::SetSocketEngineSink(IUnknownEx * pIUnknownEx)
{
//状态判断
if (m_bService==true)
{
CEventTrace::ShowEventNotify(TEXT("网络引擎处于服务状态,绑定操作忽略"),Level_Exception);
return false;
}
//设置接口
if (m_AttemperEvent.SetQueueService(pIUnknownEx)==false)
{
CEventTrace::ShowEventNotify(TEXT("网络引擎与触发服务绑定失败"),Level_Exception);
return false;
}
return true;
}
//设置端口
bool __cdecl CTCPSocketEngine::SetServicePort(WORD wListenPort)
{
//效验状态
if (m_bService==true)
{
CEventTrace::ShowEventNotify(TEXT("网络引擎处于服务状态,端口绑定操作忽略"),Level_Exception);
return false;
}
//判断参数
if (wListenPort==0)
{
CEventTrace::ShowEventNotify(TEXT("网络端口错误,端口绑定操作失败"),Level_Exception);
return false;
}
//设置变量
m_wListenPort=wListenPort;
return true;
}
//设置数目
bool __cdecl CTCPSocketEngine::SetMaxSocketItem(WORD wMaxSocketItem)
{
m_wMaxSocketItem=wMaxSocketItem;
return true;
}
//启动服务
bool __cdecl CTCPSocketEngine::StartService()
{
//效验状态
if (m_bService==true)
{
CEventTrace::ShowEventNotify(TEXT("网络引擎重复启动,启动操作忽略"),Level_Warning);
return true;
}
//判断端口
if (m_wListenPort==0)
{
CEventTrace::ShowEventNotify(TEXT("网络引擎监听端口无效"),Level_Exception);
return false;
}
//绑定对象
if (m_SendQueueService.SetQueueServiceSink(GET_MYSELF_INTERFACE(IUnknownEx))==false)
{
CEventTrace::ShowEventNotify(TEXT("网络引擎与触发服务绑定失败"),Level_Exception);
return false;
}
try
{
//获取系统信息
SYSTEM_INFO SystemInfo;
GetSystemInfo(&SystemInfo);
DWORD dwThreadCount=SystemInfo.dwNumberOfProcessors;
//建立完成端口
m_hCompletionPort=CreateIoCompletionPort(INVALID_HANDLE_VALUE,NULL,NULL,SystemInfo.dwNumberOfProcessors);
if (m_hCompletionPort==NULL) throw TEXT("网络引擎完成端口创建失败");
//建立监听SOCKET
struct sockaddr_in SocketAddr;
memset(&SocketAddr,0,sizeof(SocketAddr));
SocketAddr.sin_addr.s_addr=INADDR_ANY;
SocketAddr.sin_family=AF_INET;
SocketAddr.sin_port=htons(m_wListenPort);
m_hServerSocket=WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,NULL,0,WSA_FLAG_OVERLAPPED);
if (m_hServerSocket==INVALID_SOCKET) throw TEXT("网络引擎监听 SOCKET 创建失败");
int iErrorCode=bind(m_hServerSocket,(SOCKADDR*)&SocketAddr,sizeof(SocketAddr));
if (iErrorCode==SOCKET_ERROR) throw TEXT("网络引擎监听端口被占用,端口绑定失败");
iErrorCode=listen(m_hServerSocket,200);
if (iErrorCode==SOCKET_ERROR) throw TEXT("网络引擎监听端口被占用,端口监听失败");
//启动发送队列
bool bSuccess=m_SendQueueService.StartService();
if (bSuccess==false) throw TEXT("网络引擎发送队列服务启动失败");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -