18,363
社区成员




BYTE *pbBuf = new BYTE[64 * KBYTES];
UINT uSize = 0;
int nReceived = 0;
while(!bStopClient)
{
// 如果不可以读取,continue;
...
int n = recv(clientSocket, pbBuf+nReceived, 64 * KBYTES - nReceived);
if (n < 0)
...;// 错误处理
nReceived += n;
if (nReceived >= 4)
{
uSize = *(UINT *)pbBuf;
if (nReceived >= uSize)
...// 数据接收完整,进行下一步的解析
}
}
int CHttpSocket::WsaRecFun(char **UnzipBuffer)
{
DWORD dwRecvBytes = 0;
DWORD dwFlags = 0;
DWORD dwIndex = 0;
DWORD dwBufferCount = 1;
//char buffer[BUF_SIZE * 5]={0};
char *buffer;
// memset(buffer, 0, sizeof(buffer));
WSANETWORKEVENTS NetworkEvents;
int nRet = 0;
int nTotal = 0;
int nRecvLen = 0;
int nRecvLenCount = 0;
int nRead1 = 0;
int nRead2 = 0;
int nRead3 = 0;
int nRead4 = 0;
BYTE pDataFirst1[5] = {0};
BYTE pDataFirst2[5] = {0};
BYTE pDataFirst3[5] = {0};
BYTE pDataFirst4[5] = {0};
// while (WaitForSingleObject(hEvent, 0) == WSA_WAIT_TIMEOUT)
while(true)
{
// WSAResetEvent(ClientEventRev);//重置事件
dwIndex = ::WSAWaitForMultipleEvents(1, &ClientEventRev, FALSE, 1000, FALSE);
if(dwIndex == WSA_WAIT_TIMEOUT)// || dwIndex == WSA_WAIT_FAILED
{
// AfxMessageBox("接收超时!");
// return -1;
continue;
}
if(dwIndex == WSA_WAIT_FAILED) // 出现监听错误
{
int nErrorCode = WSAGetLastError();
if(nErrorCode == WSA_INVALID_HANDLE)
{
//AfxMessageBox("监听出现错误:无效的 lphEvents 参数!"); // 代码经常会出现这种错误
return -1;
}
else if(nErrorCode == WSA_INVALID_PARAMETER)
{
//AfxMessageBox("监听出现错误:无效的 CEvents 参数!");
return -1;
}
}
WSAEnumNetworkEvents(m_s, ClientEventRev, &NetworkEvents);//枚举事件
if(NetworkEvents.lNetworkEvents & FD_READ)
// && NetworkEvents.iErrorCode[FD_READ_BIT] == 0)//有可读数据
{
WSAResetEvent(ClientEventRev);//重置事件
// BYTE pDataFirst4[5] = {0};
char pTemp[2] = {0};
if(nTotal == 0)
{
if(nRead1 == 0)
{
nRet = recv(m_s, (char *)pDataFirst1, 1, NULL);
nRead1 = 1;
continue;
}
if(nRead2 == 0)
{
nRet = recv(m_s, (char *)pDataFirst2, 1, NULL);
nRead2 = 1;
continue;
}
if(nRead3 == 0)
{
nRet = recv(m_s, (char *)pDataFirst3, 1, NULL);
nRead3 = 1;
continue;
}
if(nRead4 == 0)
{
nRet = recv(m_s, (char *)pDataFirst4, 1, NULL);
nRead4 = 1;
//continue;
}
nTotal = pDataFirst1[0] + (pDataFirst2[0] << 8) + (pDataFirst3[0] << 16) + (pDataFirst4[0] << 24);;
memset(pDataFirst1, 0, sizeof(pDataFirst1));
memset(pDataFirst2, 0, sizeof(pDataFirst2));
memset(pDataFirst3, 0, sizeof(pDataFirst3));
memset(pDataFirst4, 0, sizeof(pDataFirst4));
buffer = new char[nTotal + 1];
memset(buffer, 0, (nTotal+1) * sizeof(char));
continue;
}
if(nTotal <= 0)
return -1;
nRecvLen = recv(m_s, buffer + nRecvLenCount, nTotal - nRecvLenCount, NULL);
nRecvLenCount = nRecvLenCount + nRecvLen;
if(nRecvLenCount < nTotal)
continue;
else
break;
}
}
int n = inflate_read(buffer, nRecvLenCount, UnzipBuffer, 1);//解压函数
delete []buffer;
if(n < 0)
return -1;
return n;
}
nTotal = pDataFirst4[0] + (pDataFirst4[1] << 8) + (pDataFirst4[2] << 16) + (pDataFirst4[3] << 24);
nTotal = *((int*)pDataFirst4);