//读取TCP数据线程
DWORD WINAPI ReadTCPDataThread(LPVOID lPvoid)
{
CSock5Client *pSock5Client = (CSock5Client *)lPvoid;
char pcBuf[MAX_SEND_BUF];
int nPreLen = MAX_SEND_BUF;
int nSize = sizeof(COMMDATA<int>);
while(!pSock5Client->m_bExitThread)
{
int nRecvNum = 0, nRecvD = 0;
COMMDATA<int>* pCommand = (COMMDATA<int>*)pcBuf;
memset(pcBuf, 0, MAX_SEND_BUF);
int nfirstLen = nSize;
int nfirstCount = 0;
int nfirstRecvLen = nfirstLen;
while(nfirstCount != nfirstLen)
{
nRecvD = recv(pSock5Client->m_socketTcp,pcBuf +nfirstCount,nfirstRecvLen,0);
nfirstCount += nRecvD;
nfirstRecvLen -= nRecvD;
}
// nRecvD = recv(pSock5Client->m_socketTcp,pcBuf,nSize,0);
//主动退出和被动退出俩种,主动退出时要判断
//接收错误再接3次, 在电脑网线拔掉时再接上时会起做用
if(nfirstCount == SOCKET_ERROR && !pSock5Client->m_bExitThread)
{
nfirstCount = recv(pSock5Client->m_socketTcp,pcBuf,nSize,0);
if(nfirstCount == SOCKET_ERROR && !pSock5Client->m_bExitThread)
{
nfirstCount = recv(pSock5Client->m_socketTcp,pcBuf,nSize,0);
if(nfirstCount == SOCKET_ERROR && !pSock5Client->m_bExitThread)
{
nfirstCount = recv(pSock5Client->m_socketTcp,pcBuf,nSize,0);
if(nfirstCount == SOCKET_ERROR && !pSock5Client->m_bExitThread)
{
pSock5Client->UnInitClient();
pSock5Client->InitSock();
m_gErrorLog.AddLog(1, "recv data error");
break;
}
}
}
}
if(nfirstCount != SOCKET_ERROR && nfirstCount>0)
{
if(pCommand->header.version == 0x201)
{
int nLen = pCommand->header.size -nSize;
int nCount = 0,nRecvS;
int nRecvLen = nLen;
while(nCount != nLen)
{
nRecvS = recv(pSock5Client->m_socketTcp,pcBuf +nSize+nCount,nRecvLen,0);
nCount += nRecvS;
nRecvLen -= nRecvS;
}
if(nRecvS != SOCKET_ERROR && nCount+nSize>0)
{
pSock5Client->m_pInMessageQueue->AddMessage(pcBuf,nCount+nSize);
//TRACE("接收到消息/n");
}
else
{
if(nRecvNum == SOCKET_ERROR)
{
pSock5Client->UnInitClient();
pSock5Client->InitSock();
m_gErrorLog.AddLog(1, "recv data error");
break;
}
Sleep(1);
}
}
else
{
//概率非常小
//需要退出并自己重新启动连接服务器
pSock5Client->UnInitClient();
pSock5Client->InitSock();
m_gErrorLog.AddLog(1, "recv data error");
break;
}
}
}
return 0;
}