📄 cmicopaccept.cpp
字号:
#include <MatrixCore/Network/CMOverlapped.h>
#include <MatrixCore/Network/CMserverSocket.h>
#include "CMIocpAccept.h"
#include "CMIocpMudule.h"
//#include ".\MatrixCore\System\CMDebug.h"
#include <MatrixCore/Pattern/CMSingleton.h>
#include <MatrixCore/Network/CMInetAddress.h>
using namespace MatrixCore::Pattern;
using namespace MatrixCore::Network;
using namespace MatrixCore::System;
//CMDebug *pAcceptDebug = NULL;
CMIocpAccept::CMIocpAccept(int iMax_User)
:dwCntID(10000),m_iMaxUser(DEF_MAXUSERSOCKET)
{
WSADATA wsaData;
char IPstr[16];
int iPort;
// pAcceptDebug = new CMDebug(MatrixCore::System::CMDebug::DEBUGTYPE_FILE,"Err/AcceptSocketErr");
m_pSerAcceptSock = NULL;
m_pClientAcceptSock = new CMServerSocket;
// 撅剂飘 蜡历 箭磊 绊沥.
SetMaxUser(iMax_User);
//泅犁 哪腔磐 酒捞乔, 器飘锅龋 5555, 府胶醋喉钒 SOMAXCONN 5
if(CMIocpMudule::GetInstance()->GetIPAddress(IPstr,&iPort))
{
m_pClientAcceptSock->Initialize(IPstr,iPort,5);
}
else
{
m_pClientAcceptSock->Initialize(5555,SOMAXCONN );
}
m_ListenSock = m_pClientAcceptSock->GetListenSocket();
//扩加 2.0滚怜 荤侩
if( ::WSAStartup( MAKEWORD( 2, 2 ), &wsaData ) != 0 )
return ;
if( wsaData.wVersion != MAKEWORD( 2, 2 ) )
{
::WSACleanup();
return ;
}
for (int i = 0; i < DEF_MAXSERVER_SOCKET; i++ )
{
//坷滚乏 备炼眉 劝寸
m_pServOverlapped[i] = NULL;
}
for (int i = 0; i < m_iMaxUser; i++ )
{
//坷滚乏 备炼眉 劝寸
m_pClientOverlapped[i] = NULL;
m_pClientOverlapped[i] = new CMOVERLAPPED;
m_pClientOverlapped[i]->pRecvContext = NULL;
m_pClientOverlapped[i]->pRecvContext = new RECVIOCONTEXT;
// 坷滚乏 备炼眉 撅剂飘侩栏肺 汲沥.
m_pClientOverlapped[i]->eState = eACCEPT;
m_pClientOverlapped[i]->iAcceptServer = eClient;
m_pClientOverlapped[i]->sOverlappedID = i;
// o->ix = ovl.size();
//Accept家南俊 滚欺甫 吧绢 初绰累诀阑 茄促.
AcceptContext( *m_pClientOverlapped[i] );
if ( m_pClientOverlapped[i]->s != INVALID_SOCKET )
ovl.push_back( m_pClientOverlapped[i] );
else
{
//家南 劝寸 角菩
int err = GetLastError();
CMSingleton<CMDebug>::getInstance()->output("%s(%d)AcceptContext() Error(%d)",__FILE__,__LINE__,err);
}
}
if(0 == CreateIoCompletionPort( (HANDLE) m_pClientAcceptSock->GetListenSocket()
, CMIocpMudule::GetInstance()->GetWorkerIOCPHandle(), 0, 0 ))
{
int err = GetLastError();
CMSingleton<CMDebug>::getInstance()->output("%s(%d)CreateIoCompletionPort() Error(%d)",__FILE__,__LINE__,err);
}
}
CMIocpAccept::~CMIocpAccept()
{
list <CMOVERLAPPED * >::iterator Iter;
// CMOVERLAPPED *pOV;
WSACleanup();
//for ( Iter = ovl.begin( ); Iter != ovl.end( ); Iter++ )
//{
// pOV = *Iter;
// delete pOV->pRecvContext;
// delete pOV;
//}
for (int i = 0; i < m_iMaxUser; i++ )
{
if(m_pClientOverlapped[i] != NULL)
{
if(m_pClientOverlapped[i]->pRecvContext != NULL)
{
delete m_pClientOverlapped[i]->pRecvContext;
m_pClientOverlapped[i]->pRecvContext = NULL;
}
delete m_pClientOverlapped[i];
m_pClientOverlapped[i] = NULL;
}
}
for (int i = 0; i < DEF_MAXSERVER_SOCKET; i++ )
{
if(m_pServOverlapped[i] != NULL)
{
if(m_pServOverlapped[i]->pRecvContext != NULL)
{
delete m_pServOverlapped[i]->pRecvContext;
m_pServOverlapped[i]->pRecvContext = NULL;
}
delete m_pServOverlapped[i];
m_pServOverlapped[i] = NULL;
}
}
if(m_pClientAcceptSock != NULL)
delete m_pClientAcceptSock;
if(m_pSerAcceptSock != NULL)
delete m_pSerAcceptSock;
//if(pAcceptDebug != NULL)
// delete pAcceptDebug;
// ovl.clear();
}
void CMIocpAccept::SetMaxUser(int iMax_User)
{
if(iMax_User >= DEF_MAXUSERSOCKET || iMax_User <= 0)
m_iMaxUser = DEF_MAXUSERSOCKET;
else
m_iMaxUser = iMax_User;
}
//-------------------------------------------------------------------------------------------------------
// Name :: void AcceptContext( CMOVERLAPPED &ov )
// Create Date :: 2004/01/12
// Description :: 撅剂飘 家南阑 窍唱 劝寸饶 坷滚乏 备炼眉 檬扁拳. 弊府绊 竣剂飘 家南阑 吧绢 霖促.
// param ::
// CMOVERLAPPED &ov : OVERLAPPED 备炼眉.
// Return Value :: void 鸥涝
// Bug Report ::
//-------------------------------------------------------------------------------------------------------
void CMIocpAccept::AcceptContext( CMOVERLAPPED &ov ,SOCKET sockListen)
{
int zero = 0;
int iErr = 0;
ov.s = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
if ( ov.s != INVALID_SOCKET )
{
// 备炼眉 檬扁拳.
ov.InitOverLapped();
// 荤侩磊付促 罚待 绊蜡 酒捞叼 何咯..
ov.dwRandomID = InterlockedIncrement(&dwCntID);
setsockopt( ov.s, SOL_SOCKET, SO_SNDBUF, (char *) &zero, sizeof zero );
setsockopt( ov.s, SOL_SOCKET, SO_RCVBUF, (char *) &zero, sizeof zero );
memset( ov.pRecvContext->AcceptBuf, '\0', sizeof ov.pRecvContext->AcceptBuf );
memset( ov.pRecvContext->RecvBuf , 0 , sizeof ov.pRecvContext->RecvBuf );
if(eServer != ov.iAcceptServer)
{
ov.iAcceptServer = eClient;
// 努扼捞攫飘螟 荤侩磊 竣剂飘甫 扒促.
if ( ! AcceptEx( m_pClientAcceptSock->GetListenSocket(), ov.s, &ov.pRecvContext->AcceptBuf[0],
/*CMOVERLAPPED::initialReceiveSize*/0, ov.addrlen,
ov.addrlen, 0, &ov ) )
{
// AcceptEx() returned FALSE, check for real errors
iErr = GetLastError();
if ( iErr != ERROR_IO_PENDING )
{
//listen 家南 角菩..
int err = GetLastError();
CMSingleton<CMDebug>::getInstance()->output("%s(%d)AcceptEx() Error(%d)",__FILE__,__LINE__,err);
}
}
}
else
{
// 辑滚螟 荤侩磊 竣剂飘甫 扒促.
if ( ! AcceptEx( m_pSerAcceptSock->GetListenSocket(), ov.s, &ov.pRecvContext->AcceptBuf[0],
/*CMOVERLAPPED::initialReceiveSize*/0, ov.addrlen,
ov.addrlen, 0, &ov ) )
{
// AcceptEx() returned FALSE, check for real errors
if ( GetLastError() != ERROR_IO_PENDING )
{
//listen 家南 角菩..
int err = GetLastError();
CMSingleton<CMDebug>::getInstance()->output("%s(%d)AcceptEx() Error(%d)",__FILE__,__LINE__,err);
}
}
}
}
else
{
//Socket Creation 角菩
int err = GetLastError();
CMSingleton<CMDebug>::getInstance()->output("%s(%d)Socket Creation Error(%d)",__FILE__,__LINE__,err);
}
}
void CMIocpAccept::SetServerAccept(char * pIP, int iPort)
{
m_pSerAcceptSock = new CMServerSocket;
if(pIP == NULL)
m_pSerAcceptSock->Initialize(CMInetAddress::GetHostAddress(),iPort,SOMAXCONN);
else
m_pSerAcceptSock->Initialize(pIP,iPort,SOMAXCONN);
for (int i = 0; i < DEF_MAXSERVER_SOCKET; i++ )
{
//坷滚乏 备炼眉 劝寸
m_pServOverlapped[i] = NULL;
m_pServOverlapped[i] = new CMOVERLAPPED;
m_pServOverlapped[i]->pRecvContext = NULL;
m_pServOverlapped[i]->pRecvContext = new RECVIOCONTEXT;
// 坷滚乏 备炼眉 撅剂飘侩栏肺 汲沥.
m_pServOverlapped[i]->eState = eACCEPT;
m_pServOverlapped[i]->iAcceptServer = eServer;
m_pServOverlapped[i]->sOverlappedID = i;
// o->ix = ovl.size();
//Accept家南俊 滚欺甫 吧绢 初绰累诀阑 茄促.
AcceptContext( *m_pServOverlapped[i],m_pSerAcceptSock->GetListenSocket() );
if ( m_pServOverlapped[i]->s != INVALID_SOCKET )
ovl.push_back( m_pServOverlapped[i] );
else
{
//家南 劝寸 角菩
int err = GetLastError();
CMSingleton<CMDebug>::getInstance()->output("%s(%d)AcceptContext() Error(%d)",__FILE__,__LINE__,err);
}
}
if(0 == CreateIoCompletionPort( (HANDLE) m_pSerAcceptSock->GetListenSocket()
, CMIocpMudule::GetInstance()->GetWorkerIOCPHandle(), 0, 0 ))
{
int err = GetLastError();
CMSingleton<CMDebug>::getInstance()->output("%s(%d)CreateIoCompletionPort() Error(%d)",__FILE__,__LINE__,err);
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////
// 积己磊 & 家戈磊
///////////////////////////////////////////////////////////////////////////////////////////////////////////
CMMemoryManager::CMMemoryManager(INT iBuffMaxSize)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -