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; }