📄 cmclientsocket.cpp
字号:
//WSAEWOULDBLOCK 捞搁 促矫 扁笛妨具 茄促.
::Sleep(1);
break;
}
m_pUnSendData->DeletePop();
}
return TRUE;
}
void CMClientSocket::StopThread()
{
m_stThreadLoop = false;
SetEvent(m_hEvent[1]);
}
DWORD CMClientSocket::EventSocketRunner(LPVOID parameter )
{
CMClientSocket* pSockThread = (CMClientSocket *)parameter;
pSockThread->run();
return 0;
}
void CMClientSocket::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]);
}
else if( dwRet == WSA_WAIT_EVENT_0+1)
{
break;
}
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 ;
}
m_pQueue->Push(NULL
, m_pRcvBuffer // 佬篮 单捞鸥 第肺 器牢磐 捞悼.
,m_dwCompleteReadSize,NULL);
//m_pQueue->PackPush(m_hConnectSocket
// , m_pRcvBuffer // 佬篮 单捞鸥 第肺 器牢磐 捞悼.
// ,m_dwCompleteReadSize,m_dwID);
}
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 if(iRet == DEF_CMSOCKSTATUS_DECODE_ERR)
{
m_pQueue->Push(NULL
, "recv err" // 佬篮 单捞鸥 第肺 器牢磐 捞悼.
,8,NULL);
}
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)//辑滚啊 摧躯促..
{
memset(m_pRcvBuffer,0,sizeof(m_pRcvBuffer) );
m_sSockState = DEF_CLOSED;
m_pQueue->Push(NULL
, m_pRcvBuffer // 佬篮 单捞鸥 第肺 器牢磐 捞悼.
,0,NULL);
printf("Server Closed!!");
break;
}
} // while....
}
//-------------------------------------------------------------------------------------------------------
// Name :: BOOL _iOnRead()
// Create Date :: 2004/01/07
// Description :: RECV窍绊 单捞鸥甫 罐绰何盒.
// param ::
// Return Value :: BOOL(int) 屈 : SOCKET 俊矾 鸥涝.
// Bug Report ::
//-------------------------------------------------------------------------------------------------------
BOOL CMClientSocket::_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)(recv Size :: %d(%d))",__FILE__,__LINE__,m_hConnectSocket,m_dwReadSize,m_dwTotalReadSize);
return DEF_CMSOCKSTATUS_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;
}
//-------------------------------------------------------------------------------------------------------
// Name :: int GetConnectInfo()
// Create Date :: 2004/01/09
// Description :: 楷搬 沥焊甫 掘绢 辰促.
// param ::
// Return Value :: int 屈 :
// DEF_NOCMD = 0x00, // 扁夯 惑怕.
// DEF_CONNECTING, // 楷搬矫档吝.
// DEF_CONNECTED, // 楷搬 己傍.
// DEF_REJECTCONNECT // 辑滚俊辑 楷搬 芭何 (盔拜 哪腔磐啊 救难廉 乐促.
// Bug Report ::
//-------------------------------------------------------------------------------------------------------
int CMClientSocket::GetConnectInfo()
{
return m_sSockState;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -