📄 cmserclientsock.cpp
字号:
}
return TRUE;
}
void CMSerClientSock::StopThread()
{
m_stThreadLoop = false;
SetEvent(m_hEvent[1]);
}
DWORD CMSerClientSock::EventSocketRunner(LPVOID parameter )
{
CMSerClientSock* pSockThread = (CMSerClientSock *)parameter;
pSockThread->run();
return 0;
}
void CMSerClientSock::run()
{
WSANETWORKEVENTS events;
DWORD dwRet;
int count = 0;
int nError;
char cFrom = 1;
unsigned short sID = 0;
unsigned short sMsgType = 0;
m_stThreadLoop = true;
//connect 啊瓷窍促.
m_IsStart = TRUE;
while(m_stThreadLoop == true )
{
dwRet = WSAWaitForMultipleEvents(2,
m_hEvent,
FALSE,
WSA_INFINITE,
FALSE);
if(dwRet == WSA_WAIT_FAILED)
{
nError = WSAGetLastError();
CMSingleton<CMDebug>::getInstance()->output("%s(%d)run() Error (%d)",__FILE__,__LINE__,nError);
}
else if( dwRet == WSA_WAIT_EVENT_0)
{
WSAResetEvent( m_hEvent[0]);
}
int nRet = WSAEnumNetworkEvents(m_hConnectSocket,
m_hEvent[0],
&events);
if (nRet == SOCKET_ERROR)
{
nError = WSAGetLastError() ;
CMSingleton<CMDebug>::getInstance()->output("%s(%d)run() Error (%d)",__FILE__,__LINE__,nError);
break;
}
if((events.lNetworkEvents & FD_READ) == FD_READ)//佬绢柯 单捞鸥啊 乐促
{
int iRet = -1;
iRet = _iOnRead(&sID,&sMsgType);
if(iRet == DEF_READCOMPLETE) // 茄俺狼 菩哦阑 己傍利栏肺 罐菌促.
{
//府矫宏钮俊 单捞鸥甫 笼绢 持绢霖促.
if(m_pQueue == NULL)
{
CMSingleton<CMDebug>::getInstance()->output("%s(%d)m_pQueue == NULL(橇肺弊伐 辆丰矫 秦力 啊瓷己.)",__FILE__,__LINE__);
return ;
}
CMOVERLAPPED OV;
OV.s = m_hConnectSocket;
m_pQueue->PackPush(m_hConnectSocket
, m_pRcvBuffer // 佬篮 单捞鸥 第肺 器牢磐 捞悼.
,m_dwCompleteReadSize,m_dwID,&OV);
}
else if(iRet == DEF_SOCKETCLOSED) //家南捞 摧躯促.
{
}
else if(iRet == DEF_ONREAD) //recv 单捞鸥甫 傈何 佬瘤 给沁促.
{
}
else if(iRet == DEF_SOCKETERROR) //家南俊矾.
{
nError = WSAGetLastError() ;
CMSingleton<CMDebug>::getInstance()->output("%s(%d)Recv Error (%d)",__FILE__,__LINE__,nError);
}
else
{
//else if(iRet == DEF_BLOCK)
//else if(iRet == DEF_MSGSIZETOOLARGE)
}
}
else if (events.lNetworkEvents & FD_CONNECT)
{
if (events.iErrorCode[FD_CONNECT_BIT] == 0)
{
//辑滚客 connect登菌促.
// m_sSockState = DEF_CONNECTED;
m_dwID = m_dwRandomID;
m_dwRandomID++;
}
else if (events.iErrorCode[FD_CONNECT_BIT] == WSAECONNREFUSED)
{
//辑滚俊辑 立加阑 芭何 窍看促.
// m_sSockState = DEF_REJECTCONNECT;
}
else
{
nError = WSAGetLastError() ;
CMSingleton<CMDebug>::getInstance()->output("%s(%d)Unknown network event error (%d)",__FILE__,__LINE__,events.iErrorCode[FD_CONNECT_BIT]);
break;
}
}
if((events.lNetworkEvents & FD_WRITE) == FD_WRITE)
{
}
//困俊 if巩苞 蝶肺 贸府 茄促. 府矫宏 皋技瘤客 努肺令啊 鞍捞 甸绢 坷绰版快啊 乐促.
if((events.lNetworkEvents & FD_CLOSE) == FD_CLOSE)//辑滚啊 摧躯促..
{
// m_sSockState = DEF_CLOSED;
printf("Server Closed!!");
}
} // while....
}
//-------------------------------------------------------------------------------------------------------
// Name :: BOOL _iOnRead()
// Create Date :: 2004/01/07
// Description :: RECV窍绊 单捞鸥甫 罐绰何盒.
// param ::
// Return Value :: BOOL(int) 屈 : SOCKET 俊矾 鸥涝.
// Bug Report ::
//-------------------------------------------------------------------------------------------------------
BOOL CMSerClientSock::_iOnRead(unsigned short *sId,unsigned short *sGameType)
{
int iRet, WSAErr;
//short * sp;
//unsigned short sID;
//unsigned short sMsgType = 0;
unsigned short sDataSize = 0;
unsigned short sReplayID = 0;
if (m_cStatus == DEF_CMSOCKSTATUS_READINGHEADER) {
iRet = recv(m_hConnectSocket, (char *)(m_pRcvBuffer + m_dwTotalReadSize), m_dwReadSize, 0);
if (iRet == SOCKET_ERROR) {
WSAErr = WSAGetLastError();
if (WSAErr != WSAEWOULDBLOCK) {
m_WSAErr = WSAErr;
return DEF_SOCKETERROR;
}
else return DEF_BLOCK;
}
else
if (iRet == 0) {
// 家南捞 摧躯促.
// m_cType = DEF_XSOCK_SHUTDOWNEDSOCK;
return DEF_SOCKETCLOSED;
}
m_dwReadSize -= iRet;
m_dwTotalReadSize += iRet;
if (m_dwReadSize == 0) {
// 庆歹甫 促 佬菌促.
m_cStatus = DEF_CMSOCKSTATUS_READINGBODY;
// 佬绢具 且 个眉 荤捞令甫 拌魂茄促.
// 庆歹 菩哦 盒籍.
if(FALSE == m_pEditPacket->PackDecode(m_pRcvBuffer)) //庆歹 菩哦捞 鞠龋拳 登绢 乐栏搁 钱绢霖促.
{
// 菩哦 庆歹啊 力措肺 救登菌促.
// 碍力 立加 辆丰.
// DoClose(OV,true);
CMSingleton<CMDebug>::getInstance()->output("%s(%d)秦欧 啊瓷己 丑饶.!!!(%d)",__FILE__,__LINE__,m_hConnectSocket);
return DEF_WORKREADERR_DECODE_ERR;
}
m_pEditPacket->GetHeaderInfo(m_pRcvBuffer,sId,sGameType,&sDataSize,&sReplayID);
// sp = (short *)((char*)m_pRcvBuffer + HEAD_SIZE_POISTION);
//m_dwReadSize = (int)*sp; // 庆歹 荤捞令绰 器窃窍瘤 臼绰促.
m_dwReadSize = (int )sDataSize;
if (m_dwReadSize == 0) {
// 个眉 荤捞令啊 0捞搁 个眉何盒阑 佬阑 鞘夸啊 绝栏骨肺
m_cStatus = DEF_CMSOCKSTATUS_READINGHEADER;
m_dwReadSize = PACKETHEADERSIZE;
m_dwCompleteReadSize = m_dwTotalReadSize;
m_dwTotalReadSize = 0;
return DEF_READCOMPLETE;
}
else
if (m_dwReadSize > m_dwBufferSize) {
m_cStatus = DEF_CMSOCKSTATUS_READINGHEADER;
m_dwReadSize = PACKETHEADERSIZE;
m_dwTotalReadSize = 0;
return DEF_MSGSIZETOOLARGE;
}
}
return DEF_ONREAD;
}
else
if (m_cStatus == DEF_CMSOCKSTATUS_READINGBODY) {
iRet = recv(m_hConnectSocket, (char *)(m_pRcvBuffer + m_dwTotalReadSize), m_dwReadSize, 0);
if (iRet == SOCKET_ERROR) {
WSAErr = WSAGetLastError();
if (WSAErr != WSAEWOULDBLOCK) {
m_WSAErr = WSAErr;
return DEF_SOCKETERROR;
}
else return DEF_BLOCK;
}
else
if (iRet == 0) {
// 家南捞 摧躯促.
// m_cType = DEF_XSOCK_SHUTDOWNEDSOCK;
return DEF_SOCKETCLOSED;
}
m_dwReadSize -= iRet;
m_dwTotalReadSize += iRet;
if (m_dwReadSize == 0) {
// 个眉甫 促 佬菌促. 促澜锅 捞亥飘甫 困秦 惑怕甫 官槽促.
m_cStatus = DEF_CMSOCKSTATUS_READINGHEADER;
m_dwReadSize = PACKETHEADERSIZE;
m_dwCompleteReadSize = m_dwTotalReadSize;
m_dwTotalReadSize = 0;
}
else return DEF_ONREAD;
}
// 皋矫瘤甫 葛滴 佬菌促. 捞 皋矫瘤甫 罐栏搁 努贰胶 滚欺狼 郴侩阑 佬绢 溜阿 贸府秦具 茄促.
return DEF_READCOMPLETE;
}
BOOL CMSerClientSock::bSetOverlapped(int iRecvQueue)
{
int zero = 0;
m_OverlappedIO.iRecvQueueNum = iRecvQueue;
m_OverlappedIO.pRecvContext = new RECVIOCONTEXT;
m_OverlappedIO.eState = eREAD;
m_OverlappedIO.iAcceptServer = eServerClient;
m_OverlappedIO.sOverlappedID = 30000;
m_OverlappedIO.iMoreRecv = 0;
m_OverlappedIO.eRecvState = eNormalRecv;
m_OverlappedIO.eState = eACCEPT;
// 荤侩磊付促 罚待 绊蜡 酒捞叼 何咯..
m_OverlappedIO.dwRandomID = 100;
setsockopt( m_OverlappedIO.s, SOL_SOCKET, SO_SNDBUF, (char *) &zero, sizeof zero );
setsockopt( m_OverlappedIO.s, SOL_SOCKET, SO_RCVBUF, (char *) &zero, sizeof zero );
memset( m_OverlappedIO.pRecvContext->AcceptBuf, '\0', sizeof m_OverlappedIO.pRecvContext->AcceptBuf );
memset( m_OverlappedIO.pRecvContext->RecvBuf , 0 , sizeof m_OverlappedIO.pRecvContext->RecvBuf );
// IOCP俊 家南 勤甸阑 楷搬秦霖促.
HANDLE hHandle = CreateIoCompletionPort( (HANDLE) m_OverlappedIO.s, CMIocpMudule::GetInstance()->GetWorkerIOCPHandle(),0/*(ULONG_PTR)&m_OverlappedIO.pKeyComplete*/, 0 );
int err = WSAGetLastError();
bServPostRecv();
return TRUE;
}
BOOL CMSerClientSock::bServPostRecv()
{
BOOL result;
m_OverlappedIO.eState = eREAD; // 坷滚乏 函荐 惑怕 函拳.
m_OverlappedIO.recvBufferDescriptor.len = PACKETBUFFERSIZE;
m_OverlappedIO.recvBufferDescriptor.buf = m_OverlappedIO.pRecvContext->RecvBuf;
m_OverlappedIO.recvFlags = 0;
result = WSARecv( m_OverlappedIO.s, &m_OverlappedIO.recvBufferDescriptor, /* number of WSABUFs */ 1,
&m_OverlappedIO.recvBufferDescriptor.len, &m_OverlappedIO.recvFlags, &m_OverlappedIO, /* completion routine address */ 0 );
result = ( result != SOCKET_ERROR ); // inverted logic
if ( result )
{
// OK
return TRUE;
}
else
{
int err = GetLastError();
if ( err != ERROR_IO_PENDING )
{
CMSingleton<CMDebug>::getInstance()->output("%s(%d)bServPostRecv() Error(%d)",__FILE__,__LINE__,err);
// DoClose( m_OverlappedIO, true );
return FALSE;
}
}
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -