Example #1
0
DWORD WINAPI ThreadRecv(PVOID param)
{
	CServerSocket *Server = (CServerSocket*)param;

	int bytesRecv = SOCKET_ERROR;
	char recvbuf[8192] = {0};	//接收区
	DWORD dwPackteCount = 0;
	char *pDataBuff = NULL;	//缓冲区
	DWORD dwDataBuffLen = 0;	//缓冲区长度

	Server->WaitClient();

	while(Server->m_bRun)
	{
		bytesRecv = recv( Server->m_ClientSocket, recvbuf, 8192, 0 );
		g_log.Trace(LOGL_TOP,LOGT_PROMPT,__TFILE__, __LINE__,_T("收到控件发过来的数据,数据大小:%d"), bytesRecv);

		if( bytesRecv == -1 || bytesRecv == 0)	//客户端断开连接
		{
			Server->m_ClientSocket = INVALID_SOCKET ;
			g_log.Trace(LOGL_TOP,LOGT_PROMPT,__TFILE__, __LINE__,_T("客户端断开连接,退出任务"));

			return 0;	//退出程序
		}

		if(pDataBuff == NULL)
		{
			pDataBuff = new char[bytesRecv];
			memcpy(pDataBuff,recvbuf,bytesRecv);
			dwDataBuffLen = bytesRecv;
		}
		else
		{
			char *tmpBuff = new char[dwDataBuffLen];
			memcpy(tmpBuff,pDataBuff,dwDataBuffLen);

			delete []pDataBuff;

			pDataBuff = new char[dwDataBuffLen + bytesRecv];

			memcpy(pDataBuff,tmpBuff,dwDataBuffLen);
			delete []tmpBuff;

			memcpy(&(pDataBuff[dwDataBuffLen]),recvbuf,bytesRecv);
			dwDataBuffLen += bytesRecv;
		}

		//包处理
		if(dwDataBuffLen<sizeof(DWORD)*2)continue; //小于最小包头不做如下处理 

		DWORD dwPacketSize = 0; //包大小
		while(TRUE)
		{
			if(dwDataBuffLen == 0)break; //缓冲区没有数据
			memcpy(&dwPacketSize,pDataBuff,sizeof(DWORD));
			if(dwPacketSize > dwDataBuffLen) 
				break; //包长度大于缓冲区长度不做处理
			char *pData = new char[dwPacketSize];	//拼一个包
			memcpy(pData,pDataBuff,dwPacketSize);

			Server->m_ProcessData.CovertBufData(pData,dwPacketSize);
			delete []pData;

			char *tmpBuff = new char[dwDataBuffLen];
			memcpy(tmpBuff,pDataBuff,dwDataBuffLen);

			delete []pDataBuff;
			dwDataBuffLen = dwDataBuffLen - dwPacketSize;
			pDataBuff = new char[dwDataBuffLen];
			memcpy(pDataBuff,&(tmpBuff[dwPacketSize]),dwDataBuffLen);
			delete []tmpBuff;
			dwPackteCount ++ ; //包计数器
		} 

		printf("总共收到数据包 %d\n",dwPackteCount); //包计数器
		Sleep(200);	//线程切换
	}
	return 0;
}